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';