Skip to content

Commit 1a02736

Browse files
scheglovCommit Queue
authored andcommitted
Elements. Build TopLevelFunctionElementImpl during building elements.
Give it a reference. Change-Id: Ie1189a18e9d2794d37e530cbbb01ddd86b78a16e Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/393164 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]>
1 parent 65ce9ed commit 1a02736

File tree

67 files changed

+781
-576
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+781
-576
lines changed

pkg/analyzer/lib/src/dart/analysis/driver.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ import 'package:meta/meta.dart';
9898
// TODO(scheglov): Clean up the list of implicitly analyzed files.
9999
class AnalysisDriver {
100100
/// The version of data format, should be incremented on every format change.
101-
static const int DATA_VERSION = 411;
101+
static const int DATA_VERSION = 412;
102102

103103
/// The number of exception contexts allowed to write. Once this field is
104104
/// zero, we stop writing any new exception contexts in this process.

pkg/analyzer/lib/src/dart/element/element.dart

Lines changed: 16 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -5234,7 +5234,8 @@ class FunctionElementImpl extends ExecutableElementImpl
52345234
/// The element corresponding to this fragment.
52355235
// TODO(brianwilkerson): Use either `LocalFunctionElement` or
52365236
// `TopLevelFunctionElement` when this class is split.
5237-
ExecutableElement2? _element;
5237+
@override
5238+
late ExecutableElement2 element;
52385239

52395240
/// Initialize a newly created function element to have the given [name] and
52405241
/// [offset].
@@ -5255,30 +5256,6 @@ class FunctionElementImpl extends ExecutableElementImpl
52555256
@override
52565257
ExecutableElement get declaration => this;
52575258

5258-
@override
5259-
ExecutableElement2 get element {
5260-
if (_element != null) {
5261-
return _element!;
5262-
}
5263-
Fragment firstFragment = this;
5264-
var previousFragment = firstFragment.previousFragment;
5265-
while (previousFragment != null) {
5266-
firstFragment = previousFragment;
5267-
previousFragment = firstFragment.previousFragment;
5268-
}
5269-
// As a side-effect of creating the element, all of the fragments in the
5270-
// chain will have their `_element` set to the newly created element.
5271-
// TODO(brianwilkerson): We need a better way to identify closures whose
5272-
// enclosing element is a compilation unit than checking for an empty name.
5273-
if (enclosingElement3 is CompilationUnitElement && name.isNotEmpty) {
5274-
return TopLevelFunctionElementImpl(firstFragment as FunctionElementImpl);
5275-
} else {
5276-
return LocalFunctionElementImpl(firstFragment as FunctionElementImpl);
5277-
}
5278-
}
5279-
5280-
set element(ExecutableElement2 element) => _element = element;
5281-
52825259
@override
52835260
Fragment? get enclosingFragment {
52845261
if (enclosingElement3 is CompilationUnitElement) {
@@ -6758,11 +6735,13 @@ class LibraryElementImpl extends ElementImpl
67586735
/// Create the [FunctionElement] to be returned by [loadLibraryFunction].
67596736
/// The [typeProvider] must be already set.
67606737
void createLoadLibraryFunction() {
6761-
_loadLibraryFunction =
6762-
FunctionElementImpl(FunctionElement.LOAD_LIBRARY_NAME, -1)
6763-
..enclosingElement3 = library
6764-
..isSynthetic = true
6765-
..returnType = typeProvider.futureDynamicType;
6738+
var fragment = FunctionElementImpl(FunctionElement.LOAD_LIBRARY_NAME, -1)
6739+
..enclosingElement3 = library
6740+
..isSynthetic = true
6741+
..returnType = typeProvider.futureDynamicType;
6742+
_loadLibraryFunction = fragment;
6743+
// TODO(scheglov): create it sooner, with actual reference.
6744+
TopLevelFunctionElementImpl(Reference.root(), fragment);
67666745
}
67676746

67686747
@override
@@ -6987,11 +6966,7 @@ class LocalFunctionElementImpl extends ExecutableElementImpl2
69876966
final FunctionElementImpl _wrappedElement;
69886967

69896968
LocalFunctionElementImpl(this._wrappedElement) {
6990-
FunctionElementImpl? fragment = _wrappedElement;
6991-
while (fragment != null) {
6992-
fragment.element = this;
6993-
fragment = fragment.nextFragment as FunctionElementImpl?;
6994-
}
6969+
_wrappedElement.element = this;
69956970
}
69966971

69976972
@override
@@ -9580,15 +9555,15 @@ class TopLevelFunctionElementImpl extends ExecutableElementImpl2
95809555
FragmentedAnnotatableElementMixin<TopLevelFunctionFragment>,
95819556
FragmentedElementMixin<TopLevelFunctionFragment>
95829557
implements TopLevelFunctionElement {
9558+
@override
9559+
final Reference reference;
9560+
95839561
@override
95849562
final FunctionElementImpl firstFragment;
95859563

9586-
TopLevelFunctionElementImpl(this.firstFragment) {
9587-
FunctionElementImpl? fragment = firstFragment;
9588-
while (fragment != null) {
9589-
fragment.element = this;
9590-
fragment = fragment.nextFragment as FunctionElementImpl?;
9591-
}
9564+
TopLevelFunctionElementImpl(this.reference, this.firstFragment) {
9565+
reference.element2 = this;
9566+
firstFragment.element = this;
95929567
}
95939568

95949569
@override

pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -766,34 +766,36 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
766766

767767
@override
768768
void visitFunctionExpression(covariant FunctionExpressionImpl node) {
769-
var element = FunctionElementImpl.forOffset(node.offset);
770-
_elementHolder.enclose(element);
771-
node.declaredElement = element;
772-
node.declaredElement2 = element.element as LocalFunctionElementImpl?;
769+
var fragment = FunctionElementImpl.forOffset(node.offset);
770+
_elementHolder.enclose(fragment);
771+
node.declaredElement = fragment;
772+
773+
var element = LocalFunctionElementImpl(fragment);
774+
node.declaredElement2 = element;
773775

774-
element.hasImplicitReturnType = true;
775-
element.returnType = DynamicTypeImpl.instance;
776+
fragment.hasImplicitReturnType = true;
777+
fragment.returnType = DynamicTypeImpl.instance;
776778

777779
FunctionBody body = node.body;
778-
element.isAsynchronous = body.isAsynchronous;
779-
element.isGenerator = body.isGenerator;
780+
fragment.isAsynchronous = body.isAsynchronous;
781+
fragment.isGenerator = body.isGenerator;
780782

781-
var holder = ElementHolder(element);
783+
var holder = ElementHolder(fragment);
782784
_withElementHolder(holder, () {
783785
_withNameScope(() {
784786
_buildTypeParameterElements(node.typeParameters);
785787
node.typeParameters?.accept(this);
786-
element.typeParameters = holder.typeParameters;
788+
fragment.typeParameters = holder.typeParameters;
787789

788790
node.parameters!.accept(this);
789-
element.parameters = holder.parameters;
791+
fragment.parameters = holder.parameters;
790792

791-
_defineParameters(element.parameters);
793+
_defineParameters(fragment.parameters);
792794
node.body.accept(this);
793795
});
794796
});
795797

796-
_setCodeRange(element, node);
798+
_setCodeRange(fragment, node);
797799
}
798800

799801
@override
@@ -1472,18 +1474,21 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
14721474
covariant FunctionDeclarationStatementImpl statement) {
14731475
var node = statement.functionDeclaration;
14741476
var nameToken = node.name;
1475-
var element = FunctionElementImpl(nameToken.lexeme, nameToken.offset);
1476-
element.name2 = nameToken.nameIfNotEmpty;
1477-
element.nameOffset2 = nameToken.offsetIfNotEmpty;
1477+
1478+
var fragment = FunctionElementImpl(nameToken.lexeme, nameToken.offset);
1479+
fragment.name2 = nameToken.nameIfNotEmpty;
1480+
fragment.nameOffset2 = nameToken.offsetIfNotEmpty;
1481+
node.declaredElement = fragment;
1482+
1483+
var element = LocalFunctionElementImpl(fragment);
1484+
node.functionExpression.declaredElement2 = element;
14781485

14791486
// The fragment's old enclosing element needs to be set before we can get
14801487
// the new element for it.
1481-
_elementHolder.enclose(element);
1482-
1483-
node.declaredElement = element;
1488+
_elementHolder.enclose(fragment);
14841489

14851490
if (!_isWildCardVariable(nameToken.lexeme)) {
1486-
_define(element);
1491+
_define(fragment);
14871492
}
14881493
}
14891494

@@ -2007,7 +2012,6 @@ class _VariableBinderErrors
20072012
}
20082013
}
20092014

2010-
20112015
extension on Token {
20122016
String? get nameIfNotEmpty {
20132017
return lexeme.isNotEmpty ? lexeme : null;

pkg/analyzer/lib/src/summary2/augmentation.dart

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class ClassElementBuilder extends InstanceElementBuilder<
3030
lastFragment.augmentation = fragment;
3131
lastFragment = fragment;
3232

33-
fragment.augmentedInternal = firstFragment.element;
33+
fragment.augmentedInternal = element;
3434
_updatedAugmented(fragment);
3535
}
3636
}
@@ -55,7 +55,7 @@ class EnumElementBuilder
5555
lastFragment.augmentation = fragment;
5656
lastFragment = fragment;
5757

58-
fragment.augmentedInternal = firstFragment.element;
58+
fragment.augmentedInternal = element;
5959
_updatedAugmented(fragment);
6060
}
6161
}
@@ -79,7 +79,7 @@ class ExtensionElementBuilder extends InstanceElementBuilder<
7979
lastFragment.augmentation = fragment;
8080
lastFragment = fragment;
8181

82-
fragment.augmentedInternal = firstFragment.element;
82+
fragment.augmentedInternal = element;
8383
_updatedAugmented(fragment);
8484
}
8585
}
@@ -104,7 +104,7 @@ class ExtensionTypeElementBuilder extends InstanceElementBuilder<
104104
lastFragment.augmentation = fragment;
105105
lastFragment = fragment;
106106

107-
fragment.augmentedInternal = firstFragment.element;
107+
fragment.augmentedInternal = element;
108108
_updatedAugmented(fragment);
109109
}
110110
}
@@ -138,21 +138,6 @@ class FragmentedElementBuilder<E extends Element2, F extends Fragment> {
138138
}
139139
}
140140

141-
class FunctionElementBuilder extends FragmentedElementBuilder<
142-
TopLevelFunctionElementImpl, FunctionElementImpl> {
143-
FunctionElementBuilder({
144-
required super.element,
145-
required super.firstFragment,
146-
});
147-
148-
void addFragment(FunctionElementImpl fragment) {
149-
if (!identical(fragment, firstFragment)) {
150-
lastFragment.augmentation = fragment;
151-
lastFragment = fragment;
152-
}
153-
}
154-
}
155-
156141
class GetterElementBuilder extends FragmentedElementBuilder<GetterElementImpl,
157142
PropertyAccessorElementImpl> {
158143
GetterElementBuilder({
@@ -164,6 +149,7 @@ class GetterElementBuilder extends FragmentedElementBuilder<GetterElementImpl,
164149
if (!identical(fragment, firstFragment)) {
165150
lastFragment.augmentation = fragment;
166151
lastFragment = fragment;
152+
fragment.element = element;
167153
}
168154
}
169155
}
@@ -385,7 +371,7 @@ class MixinElementBuilder extends InstanceElementBuilder<
385371
lastFragment.augmentation = fragment;
386372
lastFragment = fragment;
387373

388-
fragment.augmentedInternal = firstFragment.element;
374+
fragment.augmentedInternal = element;
389375
_updatedAugmented(fragment);
390376
}
391377
}
@@ -402,6 +388,23 @@ class SetterElementBuilder extends FragmentedElementBuilder<SetterElementImpl,
402388
if (!identical(fragment, firstFragment)) {
403389
lastFragment.augmentation = fragment;
404390
lastFragment = fragment;
391+
fragment.element = element;
392+
}
393+
}
394+
}
395+
396+
class TopLevelFunctionElementBuilder extends FragmentedElementBuilder<
397+
TopLevelFunctionElementImpl, FunctionElementImpl> {
398+
TopLevelFunctionElementBuilder({
399+
required super.element,
400+
required super.firstFragment,
401+
});
402+
403+
void addFragment(FunctionElementImpl fragment) {
404+
if (!identical(fragment, firstFragment)) {
405+
lastFragment.augmentation = fragment;
406+
lastFragment = fragment;
407+
fragment.element = element;
405408
}
406409
}
407410
}
@@ -417,6 +420,7 @@ class TopLevelVariableElementBuilder extends FragmentedElementBuilder<
417420
if (!identical(fragment, firstFragment)) {
418421
lastFragment.augmentation = fragment;
419422
lastFragment = fragment;
423+
fragment.element = element;
420424
}
421425
}
422426
}
@@ -432,6 +436,7 @@ class TypeAliasElementBuilder extends FragmentedElementBuilder<
432436
if (!identical(fragment, firstFragment)) {
433437
lastFragment.augmentation = fragment;
434438
lastFragment = fragment;
439+
// fragment.element = element;
435440
}
436441
}
437442
}

pkg/analyzer/lib/src/summary2/bundle_reader.dart

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1169,26 +1169,34 @@ class LibraryReader {
11691169
unitElement.functions = _reader.readTypedList(() {
11701170
var resolutionOffset = _baseResolutionOffset + _reader.readUInt30();
11711171
var reference = _readReference();
1172+
var reference2 = _readReference();
11721173
var fragmentName = _readFragmentName();
11731174
var name = reference.elementName;
11741175

1175-
var element = FunctionElementImpl(name, -1);
1176-
element.name2 = fragmentName;
1176+
var fragment = FunctionElementImpl(name, -1);
1177+
fragment.name2 = fragmentName;
1178+
1179+
if (reference2.element2 case TopLevelFunctionElementImpl element?) {
1180+
fragment.element = element;
1181+
} else {
1182+
TopLevelFunctionElementImpl(reference2, fragment);
1183+
}
1184+
11771185

11781186
var linkedData = FunctionElementLinkedData(
11791187
reference: reference,
11801188
libraryReader: this,
11811189
unitElement: unitElement,
11821190
offset: resolutionOffset,
11831191
);
1184-
element.setLinkedData(reference, linkedData);
1192+
fragment.setLinkedData(reference, linkedData);
11851193

1186-
FunctionElementFlags.read(_reader, element);
1187-
_readAugmentationTargetAny(element);
1188-
element.typeParameters = _readTypeParameters();
1189-
element.parameters = _readParameters();
1194+
FunctionElementFlags.read(_reader, fragment);
1195+
_readAugmentationTargetAny(fragment);
1196+
fragment.typeParameters = _readTypeParameters();
1197+
fragment.parameters = _readParameters();
11901198

1191-
return element;
1199+
return fragment;
11921200
});
11931201
}
11941202

pkg/analyzer/lib/src/summary2/bundle_writer.dart

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -411,19 +411,23 @@ class BundleWriter {
411411
_sink._writeOptionalStringReference(fragment.name2);
412412
}
413413

414-
void _writeFunctionElement(FunctionElementImpl element) {
414+
void _writeFunctionElement(FunctionElementImpl fragment) {
415415
_sink.writeUInt30(_resolutionSink.offset);
416-
_writeReference(element);
417-
_writeFragmentName(element);
418-
FunctionElementFlags.write(_sink, element);
419-
_writeAugmentationTargetAny(element);
420416

421-
_resolutionSink._writeAnnotationList(element.metadata);
417+
var element = fragment.element as TopLevelFunctionElementImpl;
422418

423-
_writeTypeParameters(element.typeParameters, () {
424-
_resolutionSink.writeMacroDiagnostics(element.macroDiagnostics);
425-
_resolutionSink.writeType(element.returnType);
426-
_writeList(element.parameters, _writeParameterElement);
419+
_writeReference(fragment);
420+
_writeReference2(element.reference);
421+
_writeFragmentName(fragment);
422+
FunctionElementFlags.write(_sink, fragment);
423+
_writeAugmentationTargetAny(fragment);
424+
425+
_resolutionSink._writeAnnotationList(fragment.metadata);
426+
427+
_writeTypeParameters(fragment.typeParameters, () {
428+
_resolutionSink.writeMacroDiagnostics(fragment.macroDiagnostics);
429+
_resolutionSink.writeType(fragment.returnType);
430+
_writeList(fragment.parameters, _writeParameterElement);
427431
});
428432
}
429433

0 commit comments

Comments
 (0)