Augment. Store AugmentedInvocation() node into summary.
Change-Id: Ida7fef456e2dfd54448bca5018b5b54a255167b8
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/365681
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Phil Quitslund <pquitslund@google.com>
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 6b64124..7d42fed 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -95,7 +95,7 @@
// 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 = 363;
+ static const int DATA_VERSION = 364;
/// The number of exception contexts allowed to write. Once this field is
/// zero, we stop writing any new exception contexts in this process.
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
index 765e235..fe50d77 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
@@ -44,6 +44,8 @@
return _readAssignmentExpression();
case Tag.AugmentedExpression:
return _readAugmentedExpression();
+ case Tag.AugmentedInvocation:
+ return _readAugmentedInvocation();
case Tag.AwaitExpression:
return _readAwaitExpression();
case Tag.BinaryExpression:
@@ -284,6 +286,20 @@
return node;
}
+ AugmentedInvocation _readAugmentedInvocation() {
+ var typeArguments = _readOptionalNode() as TypeArgumentListImpl?;
+ var arguments = readNode() as ArgumentListImpl;
+
+ var node = AugmentedInvocationImpl(
+ augmentedKeyword: Tokens.augmented(),
+ typeArguments: typeArguments,
+ arguments: arguments,
+ );
+ node.element = _reader.readElement() as ExecutableElement?;
+ _readExpressionResolution(node);
+ return node;
+ }
+
AwaitExpression _readAwaitExpression() {
var expression = readNode() as ExpressionImpl;
return AwaitExpressionImpl(
@@ -1294,7 +1310,7 @@
return node;
}
- TypeArgumentList _readTypeArgumentList() {
+ TypeArgumentListImpl _readTypeArgumentList() {
var arguments = _readNodeList<TypeAnnotationImpl>();
return TypeArgumentListImpl(
leftBracket: Tokens.lt(),
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_tag.dart b/pkg/analyzer/lib/src/summary2/ast_binary_tag.dart
index 30d7dad..bd48459 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_tag.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_tag.dart
@@ -49,6 +49,7 @@
static const int AssertInitializer = 82;
static const int AssignmentExpression = 96;
static const int AugmentedExpression = 111;
+ static const int AugmentedInvocation = 112;
static const int AwaitExpression = 100;
static const int BinaryExpression = 52;
static const int BooleanLiteral = 4;
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
index f7afaf5..3b1b774 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
@@ -100,6 +100,15 @@
}
@override
+ void visitAugmentedInvocation(AugmentedInvocation node) {
+ _writeByte(Tag.AugmentedInvocation);
+ _writeOptionalNode(node.typeArguments);
+ _writeNode(node.arguments);
+ _sink.writeElement(node.element);
+ _storeExpression(node);
+ }
+
+ @override
void visitAwaitExpression(AwaitExpression node) {
_writeByte(Tag.AwaitExpression);
diff --git a/pkg/analyzer/lib/src/summary2/informative_data.dart b/pkg/analyzer/lib/src/summary2/informative_data.dart
index d891e22..981a2b8 100644
--- a/pkg/analyzer/lib/src/summary2/informative_data.dart
+++ b/pkg/analyzer/lib/src/summary2/informative_data.dart
@@ -2237,6 +2237,12 @@
}
@override
+ void visitAugmentedInvocation(AugmentedInvocation node) {
+ _tokenOrNull(node.augmentedKeyword);
+ super.visitAugmentedInvocation(node);
+ }
+
+ @override
void visitBinaryExpression(BinaryExpression node) {
_tokenOrNull(node.operator);
super.visitBinaryExpression(node);
diff --git a/pkg/analyzer/test/src/summary/elements_test.dart b/pkg/analyzer/test/src/summary/elements_test.dart
index 7d95140..771e4eb 100644
--- a/pkg/analyzer/test/src/summary/elements_test.dart
+++ b/pkg/analyzer/test/src/summary/elements_test.dart
@@ -1440,6 +1440,71 @@
''');
}
+ test_augmented_field_augment_field_augmentedInvocation() async {
+ // This is invalid code, but it should not crash.
+ newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment class A {;
+ augment static const int foo = augmented();
+}
+''');
+
+ var library = await buildLibrary(r'''
+import augment 'a.dart';
+class A {
+ static const int foo = 0;
+}
+''');
+
+ checkElementText(library, r'''
+library
+ definingUnit
+ classes
+ class A @31
+ augmentation: self::@augmentation::package:test/a.dart::@classAugmentation::A
+ fields
+ static const foo @54
+ type: int
+ shouldUseTypeForInitializerInference: true
+ constantInitializer
+ IntegerLiteral
+ literal: 0 @60
+ staticType: int
+ augmentation: self::@augmentation::package:test/a.dart::@classAugmentation::A::@fieldAugmentation::foo
+ constructors
+ synthetic @-1
+ accessors
+ synthetic static get foo @-1
+ returnType: int
+ augmented
+ fields
+ self::@augmentation::package:test/a.dart::@classAugmentation::A::@fieldAugmentation::foo
+ constructors
+ self::@class::A::@constructor::new
+ accessors
+ self::@class::A::@getter::foo
+ augmentationImports
+ package:test/a.dart
+ definingUnit
+ classes
+ augment class A @43
+ augmentationTarget: self::@class::A
+ fields
+ augment static const foo @75
+ type: int
+ shouldUseTypeForInitializerInference: true
+ constantInitializer
+ AugmentedInvocation
+ augmentedKeyword: augmented @81
+ arguments: ArgumentList
+ leftParenthesis: ( @90
+ rightParenthesis: ) @91
+ element: <null>
+ staticType: InvalidType
+ augmentationTarget: self::@class::A::@field::foo
+''');
+ }
+
test_augmented_field_augment_field_differentTypes() async {
newFile('$testPackageLibPath/a.dart', r'''
augment library 'test.dart';