Skip to content

Commit 90f03db

Browse files
scheglovcommit-bot@chromium.org
authored andcommitted
Support for extensions in summary2.
I ignored unnamed extensions for now, so correspondings tests crash. [email protected] Change-Id: I3e56d1ccaf0c5839b426ea179ed6100dbb15c143 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/109727 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]>
1 parent f23418d commit 90f03db

File tree

13 files changed

+385
-16
lines changed

13 files changed

+385
-16
lines changed

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5029,9 +5029,7 @@ class ExtensionElementImpl extends ElementImpl
50295029
}
50305030

50315031
if (linkedNode != null) {
5032-
// TODO(brianwilkerson) Implement this.
5033-
// var context = enclosingUnit.linkedContext;
5034-
// return _extendedType = context.getExtendedType(linkedNode)?.type;
5032+
return _extendedType = linkedContext.getExtendedType(linkedNode).type;
50355033
} else if (_unlinkedExtension != null) {
50365034
return _extendedType = enclosingUnit.resynthesizerContext
50375035
.resolveTypeRef(this, _unlinkedExtension.extendedType);

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

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5308,6 +5308,7 @@ class LinkedNodeBuilder extends Object
53085308
kind == idl.LinkedNodeKind.enumDeclaration ||
53095309
kind == idl.LinkedNodeKind.enumConstantDeclaration ||
53105310
kind == idl.LinkedNodeKind.exportDirective ||
5311+
kind == idl.LinkedNodeKind.extensionDeclaration ||
53115312
kind == idl.LinkedNodeKind.fieldDeclaration ||
53125313
kind == idl.LinkedNodeKind.functionDeclaration ||
53135314
kind == idl.LinkedNodeKind.functionTypeAlias ||
@@ -5348,6 +5349,7 @@ class LinkedNodeBuilder extends Object
53485349
kind == idl.LinkedNodeKind.enumDeclaration ||
53495350
kind == idl.LinkedNodeKind.enumConstantDeclaration ||
53505351
kind == idl.LinkedNodeKind.exportDirective ||
5352+
kind == idl.LinkedNodeKind.extensionDeclaration ||
53515353
kind == idl.LinkedNodeKind.fieldDeclaration ||
53525354
kind == idl.LinkedNodeKind.functionDeclaration ||
53535355
kind == idl.LinkedNodeKind.functionTypeAlias ||
@@ -5540,6 +5542,12 @@ class LinkedNodeBuilder extends Object
55405542
return _variantField_6;
55415543
}
55425544

5545+
@override
5546+
LinkedNodeBuilder get extensionDeclaration_typeParameters {
5547+
assert(kind == idl.LinkedNodeKind.extensionDeclaration);
5548+
return _variantField_6;
5549+
}
5550+
55435551
@override
55445552
LinkedNodeBuilder get fieldDeclaration_fields {
55455553
assert(kind == idl.LinkedNodeKind.fieldDeclaration);
@@ -5973,6 +5981,11 @@ class LinkedNodeBuilder extends Object
59735981
_variantField_6 = value;
59745982
}
59755983

5984+
set extensionDeclaration_typeParameters(LinkedNodeBuilder value) {
5985+
assert(kind == idl.LinkedNodeKind.extensionDeclaration);
5986+
_variantField_6 = value;
5987+
}
5988+
59765989
set fieldDeclaration_fields(LinkedNodeBuilder value) {
59775990
assert(kind == idl.LinkedNodeKind.fieldDeclaration);
59785991
_variantField_6 = value;
@@ -6319,6 +6332,12 @@ class LinkedNodeBuilder extends Object
63196332
return _variantField_7;
63206333
}
63216334

6335+
@override
6336+
LinkedNodeBuilder get extensionDeclaration_extendedType {
6337+
assert(kind == idl.LinkedNodeKind.extensionDeclaration);
6338+
return _variantField_7;
6339+
}
6340+
63226341
@override
63236342
LinkedNodeBuilder get fieldFormalParameter_typeParameters {
63246343
assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
@@ -6573,6 +6592,11 @@ class LinkedNodeBuilder extends Object
65736592
_variantField_7 = value;
65746593
}
65756594

6595+
set extensionDeclaration_extendedType(LinkedNodeBuilder value) {
6596+
assert(kind == idl.LinkedNodeKind.extensionDeclaration);
6597+
_variantField_7 = value;
6598+
}
6599+
65766600
set fieldFormalParameter_typeParameters(LinkedNodeBuilder value) {
65776601
assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
65786602
_variantField_7 = value;
@@ -7403,6 +7427,12 @@ class LinkedNodeBuilder extends Object
74037427
return _variantField_5 ??= <LinkedNodeBuilder>[];
74047428
}
74057429

7430+
@override
7431+
List<LinkedNodeBuilder> get extensionDeclaration_members {
7432+
assert(kind == idl.LinkedNodeKind.extensionDeclaration);
7433+
return _variantField_5 ??= <LinkedNodeBuilder>[];
7434+
}
7435+
74067436
@override
74077437
List<LinkedNodeBuilder> get forParts_updaters {
74087438
assert(kind == idl.LinkedNodeKind.forPartsWithDeclarations ||
@@ -7416,6 +7446,11 @@ class LinkedNodeBuilder extends Object
74167446
_variantField_5 = value;
74177447
}
74187448

7449+
set extensionDeclaration_members(List<LinkedNodeBuilder> value) {
7450+
assert(kind == idl.LinkedNodeKind.extensionDeclaration);
7451+
_variantField_5 = value;
7452+
}
7453+
74197454
set forParts_updaters(List<LinkedNodeBuilder> value) {
74207455
assert(kind == idl.LinkedNodeKind.forPartsWithDeclarations ||
74217456
kind == idl.LinkedNodeKind.forPartsWithExpression);
@@ -7648,6 +7683,7 @@ class LinkedNodeBuilder extends Object
76487683
kind == idl.LinkedNodeKind.enumConstantDeclaration ||
76497684
kind == idl.LinkedNodeKind.enumDeclaration ||
76507685
kind == idl.LinkedNodeKind.exportDirective ||
7686+
kind == idl.LinkedNodeKind.extensionDeclaration ||
76517687
kind == idl.LinkedNodeKind.fieldDeclaration ||
76527688
kind == idl.LinkedNodeKind.fieldFormalParameter ||
76537689
kind == idl.LinkedNodeKind.functionDeclaration ||
@@ -7678,6 +7714,7 @@ class LinkedNodeBuilder extends Object
76787714
kind == idl.LinkedNodeKind.enumConstantDeclaration ||
76797715
kind == idl.LinkedNodeKind.enumDeclaration ||
76807716
kind == idl.LinkedNodeKind.exportDirective ||
7717+
kind == idl.LinkedNodeKind.extensionDeclaration ||
76817718
kind == idl.LinkedNodeKind.fieldDeclaration ||
76827719
kind == idl.LinkedNodeKind.fieldFormalParameter ||
76837720
kind == idl.LinkedNodeKind.functionDeclaration ||
@@ -8248,6 +8285,19 @@ class LinkedNodeBuilder extends Object
82488285
}) : _kind = idl.LinkedNodeKind.extendsClause,
82498286
_variantField_6 = extendsClause_superclass;
82508287

8288+
LinkedNodeBuilder.extensionDeclaration({
8289+
List<LinkedNodeBuilder> annotatedNode_metadata,
8290+
LinkedNodeBuilder extensionDeclaration_typeParameters,
8291+
LinkedNodeBuilder extensionDeclaration_extendedType,
8292+
List<LinkedNodeBuilder> extensionDeclaration_members,
8293+
int informativeId,
8294+
}) : _kind = idl.LinkedNodeKind.extensionDeclaration,
8295+
_variantField_4 = annotatedNode_metadata,
8296+
_variantField_6 = extensionDeclaration_typeParameters,
8297+
_variantField_7 = extensionDeclaration_extendedType,
8298+
_variantField_5 = extensionDeclaration_members,
8299+
_variantField_36 = informativeId;
8300+
82518301
LinkedNodeBuilder.fieldDeclaration({
82528302
List<LinkedNodeBuilder> annotatedNode_metadata,
82538303
LinkedNodeBuilder fieldDeclaration_fields,
@@ -9097,6 +9147,12 @@ class LinkedNodeBuilder extends Object
90979147
expressionStatement_expression?.flushInformative();
90989148
} else if (kind == idl.LinkedNodeKind.extendsClause) {
90999149
extendsClause_superclass?.flushInformative();
9150+
} else if (kind == idl.LinkedNodeKind.extensionDeclaration) {
9151+
annotatedNode_metadata?.forEach((b) => b.flushInformative());
9152+
extensionDeclaration_typeParameters?.flushInformative();
9153+
extensionDeclaration_extendedType?.flushInformative();
9154+
extensionDeclaration_members?.forEach((b) => b.flushInformative());
9155+
informativeId = null;
91009156
} else if (kind == idl.LinkedNodeKind.fieldDeclaration) {
91019157
annotatedNode_metadata?.forEach((b) => b.flushInformative());
91029158
fieldDeclaration_fields?.flushInformative();
@@ -9881,6 +9937,30 @@ class LinkedNodeBuilder extends Object
98819937
this.extendsClause_superclass?.collectApiSignature(signature);
98829938
signature.addInt(this.flags ?? 0);
98839939
signature.addString(this.name ?? '');
9940+
} else if (kind == idl.LinkedNodeKind.extensionDeclaration) {
9941+
signature.addInt(this.kind == null ? 0 : this.kind.index);
9942+
if (this.annotatedNode_metadata == null) {
9943+
signature.addInt(0);
9944+
} else {
9945+
signature.addInt(this.annotatedNode_metadata.length);
9946+
for (var x in this.annotatedNode_metadata) {
9947+
x?.collectApiSignature(signature);
9948+
}
9949+
}
9950+
if (this.extensionDeclaration_members == null) {
9951+
signature.addInt(0);
9952+
} else {
9953+
signature.addInt(this.extensionDeclaration_members.length);
9954+
for (var x in this.extensionDeclaration_members) {
9955+
x?.collectApiSignature(signature);
9956+
}
9957+
}
9958+
signature.addBool(this.extensionDeclaration_typeParameters != null);
9959+
this.extensionDeclaration_typeParameters?.collectApiSignature(signature);
9960+
signature.addBool(this.extensionDeclaration_extendedType != null);
9961+
this.extensionDeclaration_extendedType?.collectApiSignature(signature);
9962+
signature.addInt(this.flags ?? 0);
9963+
signature.addString(this.name ?? '');
98849964
} else if (kind == idl.LinkedNodeKind.fieldDeclaration) {
98859965
signature.addInt(this.kind == null ? 0 : this.kind.index);
98869966
if (this.annotatedNode_metadata == null) {
@@ -11513,6 +11593,7 @@ class _LinkedNodeImpl extends Object
1151311593
kind == idl.LinkedNodeKind.enumDeclaration ||
1151411594
kind == idl.LinkedNodeKind.enumConstantDeclaration ||
1151511595
kind == idl.LinkedNodeKind.exportDirective ||
11596+
kind == idl.LinkedNodeKind.extensionDeclaration ||
1151611597
kind == idl.LinkedNodeKind.fieldDeclaration ||
1151711598
kind == idl.LinkedNodeKind.functionDeclaration ||
1151811599
kind == idl.LinkedNodeKind.functionTypeAlias ||
@@ -11770,6 +11851,14 @@ class _LinkedNodeImpl extends Object
1177011851
return _variantField_6;
1177111852
}
1177211853

11854+
@override
11855+
idl.LinkedNode get extensionDeclaration_typeParameters {
11856+
assert(kind == idl.LinkedNodeKind.extensionDeclaration);
11857+
_variantField_6 ??=
11858+
const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
11859+
return _variantField_6;
11860+
}
11861+
1177311862
@override
1177411863
idl.LinkedNode get fieldDeclaration_fields {
1177511864
assert(kind == idl.LinkedNodeKind.fieldDeclaration);
@@ -12294,6 +12383,14 @@ class _LinkedNodeImpl extends Object
1229412383
return _variantField_7;
1229512384
}
1229612385

12386+
@override
12387+
idl.LinkedNode get extensionDeclaration_extendedType {
12388+
assert(kind == idl.LinkedNodeKind.extensionDeclaration);
12389+
_variantField_7 ??=
12390+
const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
12391+
return _variantField_7;
12392+
}
12393+
1229712394
@override
1229812395
idl.LinkedNode get fieldFormalParameter_typeParameters {
1229912396
assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
@@ -13014,6 +13111,15 @@ class _LinkedNodeImpl extends Object
1301413111
return _variantField_5;
1301513112
}
1301613113

13114+
@override
13115+
List<idl.LinkedNode> get extensionDeclaration_members {
13116+
assert(kind == idl.LinkedNodeKind.extensionDeclaration);
13117+
_variantField_5 ??=
13118+
const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
13119+
.vTableGet(_bc, _bcOffset, 5, const <idl.LinkedNode>[]);
13120+
return _variantField_5;
13121+
}
13122+
1301713123
@override
1301813124
List<idl.LinkedNode> get forParts_updaters {
1301913125
assert(kind == idl.LinkedNodeKind.forPartsWithDeclarations ||
@@ -13187,6 +13293,7 @@ class _LinkedNodeImpl extends Object
1318713293
kind == idl.LinkedNodeKind.enumConstantDeclaration ||
1318813294
kind == idl.LinkedNodeKind.enumDeclaration ||
1318913295
kind == idl.LinkedNodeKind.exportDirective ||
13296+
kind == idl.LinkedNodeKind.extensionDeclaration ||
1319013297
kind == idl.LinkedNodeKind.fieldDeclaration ||
1319113298
kind == idl.LinkedNodeKind.fieldFormalParameter ||
1319213299
kind == idl.LinkedNodeKind.functionDeclaration ||
@@ -13740,6 +13847,22 @@ abstract class _LinkedNodeMixin implements idl.LinkedNode {
1374013847
if (extendsClause_superclass != null)
1374113848
_result["extendsClause_superclass"] = extendsClause_superclass.toJson();
1374213849
}
13850+
if (kind == idl.LinkedNodeKind.extensionDeclaration) {
13851+
if (annotatedNode_metadata.isNotEmpty)
13852+
_result["annotatedNode_metadata"] =
13853+
annotatedNode_metadata.map((_value) => _value.toJson()).toList();
13854+
if (extensionDeclaration_typeParameters != null)
13855+
_result["extensionDeclaration_typeParameters"] =
13856+
extensionDeclaration_typeParameters.toJson();
13857+
if (extensionDeclaration_extendedType != null)
13858+
_result["extensionDeclaration_extendedType"] =
13859+
extensionDeclaration_extendedType.toJson();
13860+
if (extensionDeclaration_members.isNotEmpty)
13861+
_result["extensionDeclaration_members"] = extensionDeclaration_members
13862+
.map((_value) => _value.toJson())
13863+
.toList();
13864+
if (informativeId != 0) _result["informativeId"] = informativeId;
13865+
}
1374313866
if (kind == idl.LinkedNodeKind.fieldDeclaration) {
1374413867
if (annotatedNode_metadata.isNotEmpty)
1374513868
_result["annotatedNode_metadata"] =
@@ -14907,6 +15030,19 @@ abstract class _LinkedNodeMixin implements idl.LinkedNode {
1490715030
"name": name,
1490815031
};
1490915032
}
15033+
if (kind == idl.LinkedNodeKind.extensionDeclaration) {
15034+
return {
15035+
"annotatedNode_metadata": annotatedNode_metadata,
15036+
"extensionDeclaration_typeParameters":
15037+
extensionDeclaration_typeParameters,
15038+
"extensionDeclaration_extendedType": extensionDeclaration_extendedType,
15039+
"extensionDeclaration_members": extensionDeclaration_members,
15040+
"flags": flags,
15041+
"informativeId": informativeId,
15042+
"kind": kind,
15043+
"name": name,
15044+
};
15045+
}
1491015046
if (kind == idl.LinkedNodeKind.fieldDeclaration) {
1491115047
return {
1491215048
"annotatedNode_metadata": annotatedNode_metadata,

pkg/analyzer/lib/src/summary/format.fbs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,8 @@ enum LinkedNodeKind : byte {
265265

266266
extendsClause,
267267

268+
extensionDeclaration,
269+
268270
fieldDeclaration,
269271

270272
fieldFormalParameter,

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -853,6 +853,7 @@ abstract class LinkedNode extends base.SummaryClass {
853853
LinkedNodeKind.enumDeclaration,
854854
LinkedNodeKind.enumConstantDeclaration,
855855
LinkedNodeKind.exportDirective,
856+
LinkedNodeKind.extensionDeclaration,
856857
LinkedNodeKind.fieldDeclaration,
857858
LinkedNodeKind.functionDeclaration,
858859
LinkedNodeKind.functionTypeAlias,
@@ -1162,6 +1163,15 @@ abstract class LinkedNode extends base.SummaryClass {
11621163
@VariantId(6, variant: LinkedNodeKind.extendsClause)
11631164
LinkedNode get extendsClause_superclass;
11641165

1166+
@VariantId(7, variant: LinkedNodeKind.extensionDeclaration)
1167+
LinkedNode get extensionDeclaration_extendedType;
1168+
1169+
@VariantId(5, variant: LinkedNodeKind.extensionDeclaration)
1170+
List<LinkedNode> get extensionDeclaration_members;
1171+
1172+
@VariantId(6, variant: LinkedNodeKind.extensionDeclaration)
1173+
LinkedNode get extensionDeclaration_typeParameters;
1174+
11651175
@VariantId(6, variant: LinkedNodeKind.fieldDeclaration)
11661176
LinkedNode get fieldDeclaration_fields;
11671177

@@ -1331,6 +1341,7 @@ abstract class LinkedNode extends base.SummaryClass {
13311341
LinkedNodeKind.enumConstantDeclaration,
13321342
LinkedNodeKind.enumDeclaration,
13331343
LinkedNodeKind.exportDirective,
1344+
LinkedNodeKind.extensionDeclaration,
13341345
LinkedNodeKind.fieldDeclaration,
13351346
LinkedNodeKind.fieldFormalParameter,
13361347
LinkedNodeKind.functionDeclaration,
@@ -1807,6 +1818,7 @@ enum LinkedNodeKind {
18071818
expressionFunctionBody,
18081819
expressionStatement,
18091820
extendsClause,
1821+
extensionDeclaration,
18101822
fieldDeclaration,
18111823
fieldFormalParameter,
18121824
formalParameterList,

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,28 @@ class AstBinaryReader {
590590
);
591591
}
592592

593+
ExtensionDeclaration _read_extensionDeclaration(LinkedNode data) {
594+
timerAstBinaryReaderClass.start();
595+
try {
596+
var node = astFactory.extensionDeclaration(
597+
comment: _readDocumentationComment(data),
598+
metadata: _readNodeListLazy(data.annotatedNode_metadata),
599+
extensionKeyword: _Tokens.EXTENSION,
600+
name: data.name.isNotEmpty ? _declaredIdentifier(data) : null,
601+
typeParameters: _readNode(data.extensionDeclaration_typeParameters),
602+
onKeyword: _Tokens.ON,
603+
extendedType: _readNodeLazy(data.extensionDeclaration_extendedType),
604+
leftBracket: _Tokens.OPEN_CURLY_BRACKET,
605+
members: _readNodeListLazy(data.extensionDeclaration_members),
606+
rightBracket: _Tokens.CLOSE_CURLY_BRACKET,
607+
);
608+
LazyExtensionDeclaration.setData(node, data);
609+
return node;
610+
} finally {
611+
timerAstBinaryReaderClass.stop();
612+
}
613+
}
614+
593615
FieldDeclaration _read_fieldDeclaration(LinkedNode data) {
594616
var node = astFactory.fieldDeclaration2(
595617
comment: _readDocumentationComment(data),
@@ -1674,6 +1696,8 @@ class AstBinaryReader {
16741696
return _read_expressionStatement(data);
16751697
case LinkedNodeKind.extendsClause:
16761698
return _read_extendsClause(data);
1699+
case LinkedNodeKind.extensionDeclaration:
1700+
return _read_extensionDeclaration(data);
16771701
case LinkedNodeKind.fieldDeclaration:
16781702
return _read_fieldDeclaration(data);
16791703
case LinkedNodeKind.fieldFormalParameter:
@@ -1913,6 +1937,7 @@ class _Tokens {
19131937
static final EQ = TokenFactory.tokenFromType(TokenType.EQ);
19141938
static final EXPORT = TokenFactory.tokenFromKeyword(Keyword.EXPORT);
19151939
static final EXTENDS = TokenFactory.tokenFromKeyword(Keyword.EXTENDS);
1940+
static final EXTENSION = TokenFactory.tokenFromKeyword(Keyword.EXTENSION);
19161941
static final FINAL = TokenFactory.tokenFromKeyword(Keyword.FINAL);
19171942
static final FINALLY = TokenFactory.tokenFromKeyword(Keyword.FINALLY);
19181943
static final FOR = TokenFactory.tokenFromKeyword(Keyword.FOR);

0 commit comments

Comments
 (0)