Skip to content

Commit db1abd0

Browse files
bwilkersoncommit-bot@chromium.org
authored andcommitted
Initial and partial summary support for extensions
Change-Id: Ibef5045b49e1334ef28c01508b2db5e2f50f32b3 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/108183 Reviewed-by: Konstantin Shcheglov <[email protected]> Commit-Queue: Brian Wilkerson <[email protected]>
1 parent 588ab11 commit db1abd0

File tree

4 files changed

+116
-16
lines changed

4 files changed

+116
-16
lines changed

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

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1780,7 +1780,9 @@ class CompilationUnitElementImpl extends UriReferencedElementImpl
17801780
if (linkedNode != null) {
17811781
// TODO(brianwilkerson) Implement this.
17821782
} else if (_unlinkedUnit != null) {
1783-
// TODO(brianwilkerson) Implement this.
1783+
return _extensions = _unlinkedUnit.extensions
1784+
.map((e) => ExtensionElementImpl.forSerialized(e, this))
1785+
.toList(growable: false);
17841786
}
17851787

17861788
return _extensions ?? const <ExtensionElement>[];
@@ -4953,6 +4955,11 @@ class ExtensionElementImpl extends ElementImpl implements ExtensionElement {
49534955
: _unlinkedExtension = null,
49544956
super.forNode(name);
49554957

4958+
/// Initialize using the given serialized information.
4959+
ExtensionElementImpl.forSerialized(
4960+
this._unlinkedExtension, CompilationUnitElementImpl enclosingUnit)
4961+
: super.forSerialized(enclosingUnit);
4962+
49564963
@override
49574964
List<PropertyAccessorElement> get accessors {
49584965
if (_accessors != null) {
@@ -5073,6 +5080,30 @@ class ExtensionElementImpl extends ElementImpl implements ExtensionElement {
50735080
_methods = methods;
50745081
}
50755082

5083+
@override
5084+
String get name {
5085+
if (linkedNode != null) {
5086+
return reference.name;
5087+
}
5088+
if (_unlinkedExtension != null) {
5089+
return _unlinkedExtension.name;
5090+
}
5091+
return super.name;
5092+
}
5093+
5094+
@override
5095+
int get nameOffset {
5096+
if (linkedNode != null) {
5097+
return enclosingUnit.linkedContext.getNameOffset(linkedNode);
5098+
}
5099+
5100+
int offset = super.nameOffset;
5101+
if (offset == 0 && _unlinkedExtension != null) {
5102+
return _unlinkedExtension.nameOffset;
5103+
}
5104+
return offset;
5105+
}
5106+
50765107
@override
50775108
List<TypeParameterElement> get typeParameters {
50785109
if (_typeParameters != null) {
@@ -5094,17 +5125,16 @@ class ExtensionElementImpl extends ElementImpl implements ExtensionElement {
50945125
return TypeParameterElementImpl.forLinkedNode(this, reference, node);
50955126
}).toList();
50965127
} else if (_unlinkedExtension != null) {
5097-
// TODO(brianwilkerson) Implement this.
5098-
// List<UnlinkedTypeParam> unlinkedParams =
5099-
// _unlinkedExtension?.typeParameters;
5100-
// if (unlinkedParams != null) {
5101-
// int numTypeParameters = unlinkedParams.length;
5102-
// _typeParameters = new List<TypeParameterElement>(numTypeParameters);
5103-
// for (int i = 0; i < numTypeParameters; i++) {
5104-
// _typeParameters[i] = new TypeParameterElementImpl.forSerialized(
5105-
// unlinkedParams[i], this);
5106-
// }
5107-
// }
5128+
List<UnlinkedTypeParam> unlinkedParams =
5129+
_unlinkedExtension?.typeParameters;
5130+
if (unlinkedParams != null) {
5131+
int numTypeParameters = unlinkedParams.length;
5132+
_typeParameters = new List<TypeParameterElement>(numTypeParameters);
5133+
for (int i = 0; i < numTypeParameters; i++) {
5134+
_typeParameters[i] = new TypeParameterElementImpl.forSerialized(
5135+
unlinkedParams[i], this);
5136+
}
5137+
}
51085138
}
51095139

51105140
return _typeParameters ?? const <TypeParameterElement>[];
@@ -9753,7 +9783,7 @@ class TypeParameterElementImpl extends ElementImpl
97539783

97549784
/// Initialize using the given serialized information.
97559785
TypeParameterElementImpl.forSerialized(
9756-
this._unlinkedTypeParam, TypeParameterizedElementMixin enclosingElement)
9786+
this._unlinkedTypeParam, ElementImpl enclosingElement)
97579787
: super.forSerialized(enclosingElement);
97589788

97599789
/// Initialize a newly created synthetic type parameter element to have the

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,9 @@ class LibraryScope extends EnclosedScope {
587587
for (ClassElement element in compilationUnit.enums) {
588588
define(element);
589589
}
590+
for (ExtensionElement element in compilationUnit.extensions) {
591+
define(element);
592+
}
590593
for (FunctionElement element in compilationUnit.functions) {
591594
define(element);
592595
}

pkg/analyzer/lib/src/summary/link.dart

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1075,6 +1075,7 @@ abstract class CompilationUnitElementForLink
10751075
Map<String, ReferenceableElementForLink> _containedNames;
10761076
List<TopLevelVariableElementForLink> _topLevelVariables;
10771077
List<ClassElementForLink_Enum> _enums;
1078+
List<ExtensionElementForLink> _extensions;
10781079
List<TopLevelFunctionElementForLink> _functions;
10791080
List<PropertyAccessorElementForLink> _accessors;
10801081
List<FunctionTypeAliasElementForLink> _functionTypeAliases;
@@ -1152,6 +1153,17 @@ abstract class CompilationUnitElementForLink
11521153
return _enums;
11531154
}
11541155

1156+
@override
1157+
List<ExtensionElementForLink> get extensions {
1158+
if (_extensions == null) {
1159+
_extensions = <ExtensionElementForLink>[];
1160+
for (UnlinkedExtension unlinkedExtension in _unlinkedUnit.extensions) {
1161+
_extensions.add(ExtensionElementForLink(this, unlinkedExtension));
1162+
}
1163+
}
1164+
return _extensions;
1165+
}
1166+
11551167
@override
11561168
List<TopLevelFunctionElementForLink> get functions {
11571169
if (_functions == null) {
@@ -2553,6 +2565,21 @@ class ExprTypeComputer {
25532565
}
25542566
}
25552567

2568+
class ExtensionElementForLink
2569+
with ReferenceableElementForLink
2570+
implements ExtensionElementImpl {
2571+
@override
2572+
final CompilationUnitElementForLink enclosingElement;
2573+
2574+
// TODO(brianwilkerson) Remove this field if it remains unreferenced.
2575+
final UnlinkedExtension _unlinkedExtension;
2576+
2577+
ExtensionElementForLink(this.enclosingElement, this._unlinkedExtension);
2578+
2579+
@override
2580+
noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
2581+
}
2582+
25562583
/// Element representing a field resynthesized from a summary during
25572584
/// linking.
25582585
abstract class FieldElementForLink implements FieldElement {
@@ -3604,9 +3631,6 @@ abstract class LibraryElementForLink<
36043631
}
36053632
}
36063633

3607-
@override
3608-
bool get isNonNullableByDefault => _unlinkedDefiningUnit.isNNBD;
3609-
36103634
@override
36113635
ContextForLink get context => _linker.context;
36123636

@@ -3643,6 +3667,9 @@ abstract class LibraryElementForLink<
36433667
@override
36443668
bool get isInSdk => _absoluteUri.scheme == 'dart';
36453669

3670+
@override
3671+
bool get isNonNullableByDefault => _unlinkedDefiningUnit.isNNBD;
3672+
36463673
@override
36473674
bool get isSynthetic => _linkedLibrary == null;
36483675

pkg/analyzer/lib/src/summary/summarize_ast.dart

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,10 @@ class _SummarizeAstVisitor extends RecursiveAstVisitor {
238238
/// [UnlinkedClass.executables] or [UnlinkedExecutable.localFunctions].
239239
List<UnlinkedExecutableBuilder> executables = <UnlinkedExecutableBuilder>[];
240240

241+
/// List of objects which should be written to [UnlinkedUnit.extensions].
242+
final List<UnlinkedExtensionBuilder> extensions =
243+
<UnlinkedExtensionBuilder>[];
244+
241245
/// List of objects which should be written to [UnlinkedUnit.exports].
242246
final List<UnlinkedExportNonPublicBuilder> exports =
243247
<UnlinkedExportNonPublicBuilder>[];
@@ -504,6 +508,7 @@ class _SummarizeAstVisitor extends RecursiveAstVisitor {
504508
b.classes = classes;
505509
b.enums = enums;
506510
b.executables = executables;
511+
b.extensions = extensions;
507512
b.exports = exports;
508513
b.imports = unlinkedImports;
509514
b.mixins = mixins;
@@ -1183,6 +1188,41 @@ class _SummarizeAstVisitor extends RecursiveAstVisitor {
11831188
exports.add(b);
11841189
}
11851190

1191+
@override
1192+
visitExtensionDeclaration(ExtensionDeclaration node) {
1193+
int oldScopesLength = scopes.length;
1194+
enclosingClassHasConstConstructor = false;
1195+
List<UnlinkedExecutableBuilder> oldExecutables = executables;
1196+
executables = <UnlinkedExecutableBuilder>[];
1197+
List<UnlinkedVariableBuilder> oldVariables = variables;
1198+
variables = <UnlinkedVariableBuilder>[];
1199+
_TypeParameterScope typeParameterScope = new _TypeParameterScope();
1200+
scopes.add(typeParameterScope);
1201+
1202+
UnlinkedExtensionBuilder b = UnlinkedExtensionBuilder();
1203+
b.name = node.name?.name;
1204+
b.nameOffset = node.name?.offset ?? 0;
1205+
b.typeParameters =
1206+
serializeTypeParameters(node.typeParameters, typeParameterScope);
1207+
if (node.members != null) {
1208+
scopes.add(buildClassMemberScope(node.name?.name, node.members));
1209+
for (ClassMember member in node.members) {
1210+
member.accept(this);
1211+
}
1212+
scopes.removeLast();
1213+
}
1214+
b.executables = executables;
1215+
b.documentationComment = serializeDocumentation(node.documentationComment);
1216+
b.annotations = serializeAnnotations(node.metadata);
1217+
b.codeRange = serializeCodeRange(node);
1218+
extensions.add(b);
1219+
1220+
scopes.removeLast();
1221+
assert(scopes.length == oldScopesLength);
1222+
executables = oldExecutables;
1223+
variables = oldVariables;
1224+
}
1225+
11861226
@override
11871227
void visitFieldDeclaration(FieldDeclaration node) {
11881228
serializeVariables(node.fields, node.staticKeyword != null,

0 commit comments

Comments
 (0)