Skip to content

Commit 4803371

Browse files
bwilkersoncommit-bot@chromium.org
authored andcommitted
Implementation of extension override AST node
Change-Id: Ia4249512c3bc14a995179328603fb847c2fe768e Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/107925 Reviewed-by: Phil Quitslund <pquitslund@google.com> Reviewed-by: Konstantin Shcheglov <scheglov@google.com> Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
1 parent 4f78ad9 commit 4803371

File tree

9 files changed

+276
-2
lines changed

9 files changed

+276
-2
lines changed

pkg/analyzer/lib/dart/ast/ast.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,8 @@ abstract class AstVisitor<R> {
496496

497497
R visitExtensionDeclaration(ExtensionDeclaration node);
498498

499+
R visitExtensionOverride(ExtensionOverride node);
500+
499501
R visitFieldDeclaration(FieldDeclaration node);
500502

501503
R visitFieldFormalParameter(FieldFormalParameter node);

pkg/analyzer/lib/dart/ast/ast_factory.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ abstract class AstFactory {
342342
/// Returns a newly created extends clause.
343343
ExtendsClause extendsClause(Token extendsKeyword, TypeName superclass);
344344

345-
/// Return a newly created extention declaration. The list of [typeParameters]
345+
/// Return a newly created extension declaration. The list of [typeParameters]
346346
/// can be `null` if there are no type parameters.
347347
ExtensionDeclaration extensionDeclaration(
348348
{Comment comment,
@@ -356,6 +356,13 @@ abstract class AstFactory {
356356
List<ClassMember> members,
357357
Token rightBracket});
358358

359+
/// Return a newly created extension override. The list of [typeArguments]
360+
/// can be `null` if there are no type arguments.
361+
ExtensionOverride extensionOverride(
362+
{@required Identifier extensionName,
363+
TypeArgumentList typeArguments,
364+
@required ArgumentList argumentList});
365+
359366
/// Returns a newly created field declaration. Either or both of the [comment]
360367
/// and [metadata] can be `null` if the declaration does not have the
361368
/// corresponding attribute. The [staticKeyword] can be `null` if the field is

pkg/analyzer/lib/dart/ast/visitor.dart

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,9 @@ class GeneralizingAstVisitor<R> implements AstVisitor<R> {
277277
R visitExtensionDeclaration(ExtensionDeclaration node) =>
278278
visitCompilationUnitMember(node);
279279

280+
@override
281+
R visitExtensionOverride(ExtensionOverride node) => visitExpression(node);
282+
280283
@override
281284
R visitFieldDeclaration(FieldDeclaration node) => visitClassMember(node);
282285

@@ -843,6 +846,12 @@ class RecursiveAstVisitor<R> implements AstVisitor<R> {
843846
return null;
844847
}
845848

849+
@override
850+
R visitExtensionOverride(ExtensionOverride node) {
851+
node.visitChildren(this);
852+
return null;
853+
}
854+
846855
@override
847856
R visitFieldDeclaration(FieldDeclaration node) {
848857
node.visitChildren(this);
@@ -1452,6 +1461,9 @@ class SimpleAstVisitor<R> implements AstVisitor<R> {
14521461
@override
14531462
R visitExtensionDeclaration(ExtensionDeclaration node) => null;
14541463

1464+
@override
1465+
R visitExtensionOverride(ExtensionOverride node) => null;
1466+
14551467
@override
14561468
R visitFieldDeclaration(FieldDeclaration node) => null;
14571469

@@ -1828,6 +1840,9 @@ class ThrowingAstVisitor<R> implements AstVisitor<R> {
18281840
@override
18291841
R visitExtensionDeclaration(ExtensionDeclaration node) => _throw(node);
18301842

1843+
@override
1844+
R visitExtensionOverride(ExtensionOverride node) => _throw(node);
1845+
18311846
@override
18321847
R visitFieldDeclaration(FieldDeclaration node) => _throw(node);
18331848

@@ -2420,6 +2435,14 @@ class TimedAstVisitor<T> implements AstVisitor<T> {
24202435
return result;
24212436
}
24222437

2438+
@override
2439+
T visitExtensionOverride(ExtensionOverride node) {
2440+
stopwatch.start();
2441+
T result = _baseVisitor.visitExtensionOverride(node);
2442+
stopwatch.stop();
2443+
return result;
2444+
}
2445+
24232446
@override
24242447
T visitFieldDeclaration(FieldDeclaration node) {
24252448
stopwatch.start();
@@ -3196,6 +3219,9 @@ class UnifyingAstVisitor<R> implements AstVisitor<R> {
31963219
@override
31973220
R visitExtensionDeclaration(ExtensionDeclaration node) => visitNode(node);
31983221

3222+
@override
3223+
R visitExtensionOverride(ExtensionOverride node) => visitNode(node);
3224+
31993225
@override
32003226
R visitFieldDeclaration(FieldDeclaration node) => visitNode(node);
32013227

pkg/analyzer/lib/src/dart/ast/ast.dart

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3929,6 +3929,85 @@ class ExtensionDeclarationImpl extends CompilationUnitMemberImpl
39293929
}
39303930
}
39313931

3932+
/// An override to force resolution to choose a member from a specific
3933+
/// extension.
3934+
///
3935+
/// extensionOverride ::=
3936+
/// [Identifier] [TypeArgumentList]? [ArgumentList]
3937+
class ExtensionOverrideImpl extends ExpressionImpl
3938+
implements ExtensionOverride {
3939+
/// The list of arguments to the override. In valid code this will contain a
3940+
/// single argument, which evaluates to the object being extended.
3941+
ArgumentListImpl _argumentList;
3942+
3943+
/// The name of the extension being selected.
3944+
IdentifierImpl _extensionName;
3945+
3946+
/// The type arguments to be applied to the extension, or `null` if no type
3947+
/// arguments were provided.
3948+
TypeArgumentListImpl _typeArguments;
3949+
3950+
ExtensionOverrideImpl(IdentifierImpl extensionName,
3951+
TypeArgumentListImpl typeArguments, ArgumentListImpl argumentList) {
3952+
_extensionName = _becomeParentOf(extensionName);
3953+
_typeArguments = _becomeParentOf(typeArguments);
3954+
_argumentList = _becomeParentOf(argumentList);
3955+
}
3956+
3957+
@override
3958+
ArgumentList get argumentList => _argumentList;
3959+
3960+
void set argumentList(ArgumentList argumentList) {
3961+
_argumentList = _becomeParentOf(argumentList as ArgumentListImpl);
3962+
}
3963+
3964+
@override
3965+
Token get beginToken => _extensionName?.beginToken;
3966+
3967+
@override
3968+
Iterable<SyntacticEntity> get childEntities => new ChildEntities()
3969+
..add(_extensionName)
3970+
..add(_typeArguments)
3971+
..add(_argumentList);
3972+
3973+
@override
3974+
Token get endToken => _argumentList?.endToken;
3975+
3976+
@override
3977+
Identifier get extensionName => _extensionName;
3978+
3979+
void set extensionName(Identifier extensionName) {
3980+
_extensionName = _becomeParentOf(extensionName as IdentifierImpl);
3981+
}
3982+
3983+
@override
3984+
Precedence get precedence => Precedence.postfix;
3985+
3986+
@override
3987+
TypeArgumentList get typeArguments => _typeArguments;
3988+
3989+
void set typeArguments(TypeArgumentList typeArguments) {
3990+
_typeArguments = _becomeParentOf(typeArguments as TypeArgumentListImpl);
3991+
}
3992+
3993+
@override
3994+
// TODO(brianwilkerson) Either implement this getter or remove it if it isn't
3995+
// needed.
3996+
List<DartType> get typeArgumentTypes => null;
3997+
3998+
@override
3999+
E accept<E>(AstVisitor<E> visitor) {
4000+
return visitor.visitExtensionOverride(this);
4001+
}
4002+
4003+
@override
4004+
void visitChildren(AstVisitor visitor) {
4005+
_extensionName?.accept(visitor);
4006+
_typeArguments?.accept(visitor);
4007+
_argumentList?.accept(visitor);
4008+
}
4009+
}
4010+
39324011
/// The declaration of one or more fields of the same type.
39334012
///
39344013
/// fieldDeclaration ::=

pkg/analyzer/lib/src/dart/ast/ast_factory.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,13 @@ class AstFactoryImpl extends AstFactory {
393393
members,
394394
rightBracket);
395395

396+
@override
397+
ExtensionOverride extensionOverride(
398+
{@required Identifier extensionName,
399+
TypeArgumentList typeArguments,
400+
@required ArgumentList argumentList}) =>
401+
ExtensionOverrideImpl(extensionName, typeArguments, argumentList);
402+
396403
@override
397404
FieldDeclaration fieldDeclaration(
398405
Comment comment,

pkg/analyzer/lib/src/dart/ast/utilities.dart

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,13 @@ class AstCloner implements AstVisitor<AstNode> {
461461
members: cloneNodeList(node.members),
462462
rightBracket: cloneToken(node.rightBracket));
463463

464+
@override
465+
ExtensionOverride visitExtensionOverride(ExtensionOverride node) =>
466+
astFactory.extensionOverride(
467+
extensionName: cloneNode(node.extensionName),
468+
typeArguments: cloneNode(node.typeArguments),
469+
argumentList: cloneNode(node.argumentList));
470+
464471
@override
465472
FieldDeclaration visitFieldDeclaration(FieldDeclaration node) =>
466473
astFactory.fieldDeclaration2(
@@ -1603,6 +1610,14 @@ class AstComparator implements AstVisitor<bool> {
16031610
isEqualTokens(node.rightBracket, other.rightBracket);
16041611
}
16051612

1613+
@override
1614+
bool visitExtensionOverride(ExtensionOverride node) {
1615+
ExtensionOverride other = _other as ExtensionOverride;
1616+
return isEqualNodes(node.extensionName, other.extensionName) &&
1617+
isEqualNodes(node.typeArguments, other.typeArguments) &&
1618+
isEqualNodes(node.argumentList, other.argumentList);
1619+
}
1620+
16061621
@override
16071622
bool visitFieldDeclaration(FieldDeclaration node) {
16081623
FieldDeclaration other = _other as FieldDeclaration;
@@ -2855,6 +2870,13 @@ class IncrementalAstCloner implements AstVisitor<AstNode> {
28552870
members: _cloneNodeList(node.members),
28562871
rightBracket: _mapToken(node.rightBracket));
28572872

2873+
@override
2874+
ExtensionOverride visitExtensionOverride(ExtensionOverride node) =>
2875+
astFactory.extensionOverride(
2876+
extensionName: _cloneNode(node.extensionName),
2877+
typeArguments: _cloneNode(node.typeArguments),
2878+
argumentList: _cloneNode(node.argumentList));
2879+
28582880
@override
28592881
FieldDeclaration visitFieldDeclaration(FieldDeclaration node) =>
28602882
astFactory.fieldDeclaration2(
@@ -4293,6 +4315,22 @@ class NodeReplacer implements AstVisitor<bool> {
42934315
return visitNode(node);
42944316
}
42954317

4318+
@override
4319+
bool visitExtensionOverride(ExtensionOverride node) {
4320+
if (identical(node.extensionName, _oldNode)) {
4321+
(node as ExtensionOverrideImpl).extensionName = _newNode as Identifier;
4322+
return true;
4323+
} else if (identical(node.typeArguments, _oldNode)) {
4324+
(node as ExtensionOverrideImpl).typeArguments =
4325+
_newNode as TypeArgumentList;
4326+
return true;
4327+
} else if (identical(node.argumentList, _oldNode)) {
4328+
(node as ExtensionOverrideImpl).argumentList = _newNode as ArgumentList;
4329+
return true;
4330+
}
4331+
return visitNode(node);
4332+
}
4333+
42964334
@override
42974335
bool visitFieldDeclaration(FieldDeclaration node) {
42984336
if (identical(node.fields, _oldNode)) {
@@ -5664,6 +5702,15 @@ class ResolutionCopier implements AstVisitor<bool> {
56645702
return false;
56655703
}
56665704

5705+
@override
5706+
bool visitExtensionOverride(ExtensionOverride node) {
5707+
ExtensionOverride toNode = this._toNode as ExtensionOverride;
5708+
return _and(
5709+
_isEqualNodes(node.extensionName, toNode.extensionName),
5710+
_isEqualNodes(node.typeArguments, toNode.typeArguments),
5711+
_isEqualNodes(node.argumentList, toNode.argumentList));
5712+
}
5713+
56675714
@override
56685715
bool visitFieldDeclaration(FieldDeclaration node) {
56695716
FieldDeclaration toNode = this._toNode as FieldDeclaration;
@@ -7247,6 +7294,13 @@ class ToSourceVisitor implements AstVisitor<void> {
72477294
_visitToken(node.rightBracket);
72487295
}
72497296

7297+
@override
7298+
void visitExtensionOverride(ExtensionOverride node) {
7299+
_visitNode(node.extensionName);
7300+
_visitNode(node.typeArguments);
7301+
_visitNode(node.argumentList);
7302+
}
7303+
72507304
@override
72517305
void visitFieldDeclaration(FieldDeclaration node) {
72527306
_visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
@@ -8547,6 +8601,13 @@ class ToSourceVisitor2 implements AstVisitor<void> {
85478601
safelyVisitToken(node.rightBracket);
85488602
}
85498603

8604+
@override
8605+
void visitExtensionOverride(ExtensionOverride node) {
8606+
safelyVisitNode(node.extensionName);
8607+
safelyVisitNode(node.typeArguments);
8608+
safelyVisitNode(node.argumentList);
8609+
}
8610+
85508611
@override
85518612
void visitFieldDeclaration(FieldDeclaration node) {
85528613
safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");

pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ class AstTestFactory {
293293
List<Directive> directives,
294294
List<CompilationUnitMember> declarations,
295295
FeatureSet featureSet}) =>
296-
astFactory.compilationUnit2(
296+
astFactory.compilationUnit(
297297
beginToken: TokenFactory.tokenFromType(TokenType.EOF),
298298
scriptTag:
299299
scriptTag == null ? null : AstTestFactory.scriptTag(scriptTag),
@@ -505,6 +505,15 @@ class AstTestFactory {
505505
rightBracket:
506506
TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET));
507507

508+
static ExtensionOverride extensionOverride(
509+
{@required Identifier extensionName,
510+
TypeArgumentList typeArguments,
511+
@required ArgumentList argumentList}) =>
512+
astFactory.extensionOverride(
513+
extensionName: extensionName,
514+
typeArguments: typeArguments,
515+
argumentList: argumentList);
516+
508517
static FieldDeclaration fieldDeclaration(bool isStatic, Keyword keyword,
509518
TypeAnnotation type, List<VariableDeclaration> variables) =>
510519
astFactory.fieldDeclaration2(

0 commit comments

Comments
 (0)