Skip to content

Commit

Permalink
Version 3.7.0-28.0.dev
Browse files Browse the repository at this point in the history
Merge 58cc805 into dev
  • Loading branch information
Dart CI committed Oct 16, 2024
2 parents 7fce354 + 58cc805 commit 97ad2c8
Show file tree
Hide file tree
Showing 39 changed files with 1,626 additions and 1,329 deletions.
47 changes: 47 additions & 0 deletions pkg/analyzer/lib/dart/element/element2.dart
Original file line number Diff line number Diff line change
Expand Up @@ -369,6 +369,9 @@ abstract class ConstructorFragment implements ExecutableFragment {
@override
InstanceFragment? get enclosingFragment;

@override
ConstructorFragmentName? get name2;

/// The offset of the end of the name in this fragment.
///
/// Returns `null` if the fragment has no name.
Expand All @@ -386,6 +389,12 @@ abstract class ConstructorFragment implements ExecutableFragment {
ConstructorFragment? get previousFragment;
}

/// The name of a [ConstructorFragment].
abstract class ConstructorFragmentName extends FragmentName {
/// The offset of the `.` before the name.
int? get periodOffset;
}

/// The base class for all of the elements in the element model.
///
/// Generally speaking, the element model is a semantic model of the program
Expand Down Expand Up @@ -949,6 +958,18 @@ abstract class Fragment {
/// Returns `null` if this fragment doesn't have a name.
String? get name;

/// The name of this fragment.
///
/// Returns `null` if the fragment does not have a name, e.g. an unnamed
/// [ExtensionFragment].
///
/// Returns `null` if the fragment is an unnamed [ConstructorFragment],
/// even if its [ConstructorElement2] has the name `new`.
///
/// Returns `null` if the fragment declaration node does not have the name
/// specified, and the parser inserted a synthetic identifier.
FragmentName? get name2;

/// The offset of the name in this fragment.
///
/// Returns `null` if the fragment has no name.
Expand All @@ -975,6 +996,32 @@ abstract class FragmentedElement {
Fragment? get firstFragment;
}

/// The name of a [Fragment].
abstract class FragmentName {
/// The name of the fragment.
///
/// Never empty.
///
/// If a fragment, e.g. an [ExtensionFragment], does not have a name,
/// then the whole [FragmentName] is `null`.
///
/// Similarly, an unnamed [ConstructorFragment] does not have a name, even
/// if the [ConstructorElement2] has the name `new`.
///
/// If the fragment declaration node does not have the name specified, and
/// the parser inserted a synthetic token, then the whole [FragmentName]
/// is `null`.
///
/// For a [SetterFragment] this is the identifier, without `=` at the end.
String get name;

/// The offset of the end of the name.
int? get nameEnd;

/// The offset of the name in the file.
int get nameOffset;
}

/// An element that has a [FunctionType] as its [type].
///
/// This also provides convenient access to the parameters and return type.
Expand Down
2 changes: 1 addition & 1 deletion pkg/analyzer/lib/src/dart/analysis/driver.dart
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ import 'package:meta/meta.dart';
// TODO(scheglov): Clean up the list of implicitly analyzed files.
class AnalysisDriver {
/// The version of data format, should be incremented on every format change.
static const int DATA_VERSION = 391;
static const int DATA_VERSION = 393;

/// The number of exception contexts allowed to write. Once this field is
/// zero, we stop writing any new exception contexts in this process.
Expand Down
138 changes: 138 additions & 0 deletions pkg/analyzer/lib/src/dart/element/element.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1041,6 +1041,9 @@ class CompilationUnitElementImpl extends UriReferencedElementImpl
@override
List<MixinFragment> get mixins2 => mixins.cast<MixinFragment>();

@override
FragmentName? get name2 => null;

@override
LibraryFragment? get nextFragment {
var units = library.units;
Expand Down Expand Up @@ -1332,6 +1335,9 @@ class ConstructorElementImpl extends ExecutableElementImpl
@override
int? nameEnd;

@override
ConstructorFragmentNameImpl? name2;

/// For every constructor we initially set this flag to `true`, and then
/// set it to `false` during computing constant values if we detect that it
/// is a part of a cycle.
Expand Down Expand Up @@ -1637,6 +1643,18 @@ mixin ConstructorElementMixin implements ConstructorElement {
}
}

class ConstructorFragmentNameImpl extends FragmentNameImpl
implements ConstructorFragmentName {
@override
int periodOffset;

ConstructorFragmentNameImpl({
required super.name,
required super.nameOffset,
required this.periodOffset,
});
}

/// A [TopLevelVariableElement] for a top-level 'const' variable that has an
/// initializer.
class ConstTopLevelVariableElementImpl extends TopLevelVariableElementImpl
Expand Down Expand Up @@ -3562,6 +3580,21 @@ abstract class ExecutableElementImpl extends _ExistingElementImpl
return super.name!;
}

@override
FragmentName? get name2 {
var name = this.name;

// If synthetic name.
if (name.isEmpty) {
return null;
}

return FragmentNameImpl(
name: name,
nameOffset: nameOffset,
);
}

@override
List<ParameterElement> get parameters {
linkedData?.read(this);
Expand Down Expand Up @@ -4704,6 +4737,22 @@ mixin FragmentedTypeParameterizedElementMixin<
}
}

class FragmentNameImpl implements FragmentName {
@override
final String name;

@override
int nameOffset;

FragmentNameImpl({
required this.name,
required this.nameOffset,
});

@override
int? get nameEnd => nameOffset + name.length;
}

/// A concrete implementation of a [FunctionElement].
class FunctionElementImpl extends ExecutableElementImpl
with AugmentableElement<FunctionElementImpl>
Expand Down Expand Up @@ -4884,6 +4933,9 @@ class GenericFunctionTypeElementImpl extends _ExistingElementImpl
@override
ElementLinkedData<ElementImpl>? get linkedData => null;

@override
FragmentName? get name2 => null;

@override
GenericFunctionTypeFragment? get nextFragment =>
throw UnsupportedError('This is not a fragment');
Expand Down Expand Up @@ -5142,6 +5194,26 @@ abstract class InstanceElementImpl extends _ExistingElementImpl
@override
List<MethodFragment> get methods2 => methods.cast<MethodFragment>();

@override
FragmentName? get name2 {
var name = this.name;

// If unnamed extension.
if (name == null) {
return null;
}

// If synthetic name.
if (name.isEmpty) {
return null;
}

return FragmentNameImpl(
name: name,
nameOffset: nameOffset,
);
}

@override
InstanceFragment? get nextFragment => augmentation as InstanceFragment?;

Expand Down Expand Up @@ -8502,6 +8574,19 @@ class ParameterElementImpl extends VariableElementImpl
LibraryFragment get libraryFragment =>
thisOrAncestorOfType<CompilationUnitElementImpl>() as LibraryFragment;

@override
FragmentName? get name2 {
var name = this.name;
if (name.isEmpty) {
return null;
}

return FragmentNameImpl(
name: name,
nameOffset: nameOffset,
);
}

@override
// TODO(augmentations): Support chaining between the fragments.
FormalParameterFragment? get nextFragment => null;
Expand Down Expand Up @@ -8932,6 +9017,14 @@ class PrefixFragmentImpl implements PrefixFragment {

@override
CompilationUnitElementImpl get libraryFragment => enclosingFragment;

@override
FragmentName? get name2 {
return FragmentNameImpl(
name: name,
nameOffset: nameOffset,
);
}
}

abstract class PromotableElementImpl2 extends VariableElementImpl2
Expand Down Expand Up @@ -9330,6 +9423,21 @@ abstract class PropertyInducingElementImpl
LibraryFragment get libraryFragment =>
thisOrAncestorOfType<CompilationUnitElement>() as LibraryFragment;

@override
FragmentName? get name2 {
var name = this.name;

// If synthetic name.
if (name.isEmpty) {
return null;
}

return FragmentNameImpl(
name: name,
nameOffset: nameOffset,
);
}

@override
PropertyInducingFragment? get nextFragment =>
augmentation as PropertyInducingFragment?;
Expand Down Expand Up @@ -9927,6 +10035,21 @@ class TypeAliasElementImpl extends _ExistingElementImpl
return super.name!;
}

@override
FragmentName? get name2 {
var name = this.name;

// If synthetic name.
if (name.isEmpty) {
return null;
}

return FragmentNameImpl(
name: name,
nameOffset: nameOffset,
);
}

@override
// TODO(augmentations): Support the fragment chain.
TypeAliasFragment? get nextFragment => null;
Expand Down Expand Up @@ -10213,6 +10336,21 @@ class TypeParameterElementImpl extends ElementImpl
return super.name!;
}

@override
FragmentName? get name2 {
var name = this.name;

// If synthetic name.
if (name.isEmpty) {
return null;
}

return FragmentNameImpl(
name: name,
nameOffset: nameOffset,
);
}

@override
// TODO(augmentations): Support chaining between the fragments.
TypeParameterFragment? get nextFragment => null;
Expand Down
7 changes: 7 additions & 0 deletions pkg/analyzer/lib/src/summary2/bundle_reader.dart
Original file line number Diff line number Diff line change
Expand Up @@ -840,6 +840,13 @@ class LibraryReader {
var reference = _readReference();
var name = reference.elementName.ifEqualThen('new', '');
var element = ConstructorElementImpl(name, -1);
element.name2 = _reader.readOptionalObject((reader) {
return ConstructorFragmentNameImpl(
name: _reader.readStringReference(),
nameOffset: -1,
periodOffset: -1,
);
});
var linkedData = ConstructorElementLinkedData(
reference: reference,
libraryReader: this,
Expand Down
3 changes: 3 additions & 0 deletions pkg/analyzer/lib/src/summary2/bundle_writer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,9 @@ class BundleWriter {
void _writeConstructorElement(ConstructorElementImpl element) {
_sink.writeUInt30(_resolutionSink.offset);
_writeReference(element);
_sink.writeOptionalObject(element.name2, (name) {
_sink._writeStringReference(name.name);
});
ConstructorElementFlags.write(_sink, element);
_resolutionSink._writeAnnotationList(element.metadata);

Expand Down
14 changes: 14 additions & 0 deletions pkg/analyzer/lib/src/summary2/element_builder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,13 @@ class ElementBuilder extends ThrowingAstVisitor<void> {
element.metadata = _buildAnnotations(node.metadata);
element.nameEnd = nameNode.end;
element.periodOffset = node.period?.offset;
if ((node.period, node.name) case (var period?, var name?)) {
element.name2 = ConstructorFragmentNameImpl(
name: name.lexeme,
nameOffset: name.offset,
periodOffset: period.offset,
);
}
_setCodeRange(element, node);
_setDocumentation(element, node);

Expand Down Expand Up @@ -1505,6 +1512,13 @@ class ElementBuilder extends ThrowingAstVisitor<void> {
..nameEnd = nameEnd
..parameters = [formalParameterElement]
..periodOffset = periodOffset;
if (representation.constructorName case var constructorName?) {
constructorElement.name2 = ConstructorFragmentNameImpl(
name: constructorName.name.lexeme,
nameOffset: constructorName.name.offset,
periodOffset: constructorName.period.offset,
);
}
_setCodeRange(constructorElement, representation);

representation.constructorElement = constructorElement;
Expand Down
Loading

0 comments on commit 97ad2c8

Please sign in to comment.