Introduce support for augmentation libraries in Dart.g

Change-Id: Icc4b89f1b25dd633279d87e9d51f85372d962c7b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/358450
Commit-Queue: Erik Ernst <eernst@google.com>
Reviewed-by: William Hesse <whesse@google.com>
diff --git a/tools/spec_parser/Dart.g b/tools/spec_parser/Dart.g
index 7551dc9..70c4f84 100644
--- a/tools/spec_parser/Dart.g
+++ b/tools/spec_parser/Dart.g
@@ -4,6 +4,8 @@
 
 // CHANGES:
 //
+// v0.40 Include support for augmentation libraries.
+//
 // v0.39 Include latest changes to mixin related class modifiers.
 //
 // v0.38 Broaden `initializerExpression` to match implemented behavior.
@@ -266,13 +268,12 @@
     |    EXTERNAL getterSignature ';'
     |    EXTERNAL setterSignature ';'
     |    EXTERNAL finalVarOrType identifierList ';'
-    |    getterSignature functionBody
-    |    setterSignature functionBody
-    |    functionSignature functionBody
-    |    (FINAL | CONST) type? staticFinalDeclarationList ';'
-    |    LATE FINAL type? initializedIdentifierList ';'
-    |    LATE? varOrType identifier ('=' expression)?
-         (',' initializedIdentifier)* ';'
+    |    AUGMENT? getterSignature functionBody
+    |    AUGMENT? setterSignature functionBody
+    |    AUGMENT? functionSignature functionBody
+    |    AUGMENT? (FINAL | CONST) type? staticFinalDeclarationList ';'
+    |    AUGMENT? LATE FINAL type? initializedIdentifierList ';'
+    |    AUGMENT? LATE? varOrType initializedIdentifierList ';'
     ;
 
 declaredIdentifier
@@ -391,7 +392,7 @@
     ;
 
 classDeclaration
-    :    (classModifiers | mixinClassModifiers)
+    :    AUGMENT? (classModifiers | mixinClassModifiers)
          CLASS typeWithParameters superclass? interfaces?
          LBRACE (metadata classMemberDeclaration)* RBRACE
     |    classModifiers MIXIN? CLASS mixinApplicationClass
@@ -420,7 +421,7 @@
     ;
 
 classMemberDeclaration
-    :    methodSignature functionBody
+    :    AUGMENT? methodSignature functionBody
     |    declaration ';'
     ;
 
@@ -429,7 +430,7 @@
     ;
 
 mixinDeclaration
-    :    BASE? MIXIN typeIdentifier typeParameters?
+    :    AUGMENT? BASE? MIXIN typeWithParameters
          (ON typeNotVoidNotFunctionList)? interfaces?
          LBRACE (metadata mixinMemberDeclaration)* RBRACE
     ;
@@ -440,9 +441,8 @@
     ;
 
 extensionTypeDeclaration
-    :    EXTENSION TYPE CONST? typeWithParameters
-         representationDeclaration
-         interfaces?
+    :    AUGMENT? EXTENSION TYPE CONST? typeWithParameters
+         representationDeclaration interfaces?
          LBRACE (metadata extensionTypeMemberDeclaration)* RBRACE
     ;
 
@@ -457,12 +457,12 @@
     ;
 
 extensionDeclaration
-    :    EXTENSION typeIdentifierNotType? typeParameters? ON type
-         LBRACE (metadata extensionMemberDefinition)* RBRACE
+    :    AUGMENT? EXTENSION typeIdentifierNotType? typeParameters? ON type
+         LBRACE (metadata extensionMemberDeclaration)* RBRACE
     ;
 
 // TODO: We might want to make this more strict.
-extensionMemberDefinition
+extensionMemberDeclaration
     :    classMemberDeclaration
     ;
 
@@ -484,17 +484,17 @@
     |    (EXTERNAL STATIC?)? setterSignature
     |    (EXTERNAL STATIC?)? functionSignature
     |    EXTERNAL (STATIC? finalVarOrType | COVARIANT varOrType) identifierList
-    |    ABSTRACT (finalVarOrType | COVARIANT varOrType) identifierList
     |    EXTERNAL? operatorSignature
-    |    STATIC (FINAL | CONST) type? staticFinalDeclarationList
-    |    STATIC LATE FINAL type? initializedIdentifierList
-    |    STATIC LATE? varOrType initializedIdentifierList
-    |    COVARIANT LATE FINAL type? identifierList
-    |    COVARIANT LATE? varOrType initializedIdentifierList
-    |    LATE? (FINAL type? | varOrType) initializedIdentifierList
-    |    redirectingFactoryConstructorSignature
-    |    constantConstructorSignature (redirection | initializers)?
-    |    constructorSignature (redirection | initializers)?
+    |    ABSTRACT (finalVarOrType | COVARIANT varOrType) identifierList
+    |    AUGMENT? STATIC (FINAL | CONST) type? staticFinalDeclarationList
+    |    AUGMENT? STATIC LATE FINAL type? initializedIdentifierList
+    |    AUGMENT? STATIC LATE? varOrType initializedIdentifierList
+    |    AUGMENT? COVARIANT LATE FINAL type? identifierList
+    |    AUGMENT? COVARIANT LATE? varOrType initializedIdentifierList
+    |    AUGMENT? LATE? (FINAL type? | varOrType) initializedIdentifierList
+    |    AUGMENT? redirectingFactoryConstructorSignature
+    |    AUGMENT? constantConstructorSignature (redirection | initializers)?
+    |    AUGMENT? constructorSignature (redirection | initializers)?
     ;
 
 staticFinalDeclarationList
@@ -591,7 +591,7 @@
     ;
 
 enumType
-    :    ENUM typeIdentifier typeParameters? mixins? interfaces? LBRACE
+    :    AUGMENT? ENUM typeWithParameters? mixins? interfaces? LBRACE
          enumEntry (',' enumEntry)* (',')?
          (';' (metadata classMemberDeclaration)*)?
          RBRACE
@@ -1360,7 +1360,12 @@
     ;
 
 libraryName
-    :    metadata LIBRARY dottedIdentifierList? ';'
+    :    metadata libraryNameBody ';'
+    ;
+
+libraryNameBody
+    :    LIBRARY dottedIdentifierList?
+    |    AUGMENT LIBRARY uri
     ;
 
 dottedIdentifierList
@@ -1369,6 +1374,7 @@
 
 importOrExport
     :    libraryImport
+    |    libraryAugmentImport
     |    libraryExport
     ;
 
@@ -1376,6 +1382,10 @@
     :    metadata importSpecification
     ;
 
+libraryAugmentImport
+    :    metadata IMPORT AUGMENT uri ';'
+    ;
+
 importSpecification
     :    IMPORT configurableUri (DEFERRED? AS typeIdentifier)? combinator* ';'
     ;
@@ -1487,8 +1497,8 @@
     ;
 
 typeAlias
-    :    TYPEDEF typeIdentifier typeParameters? '=' type ';'
-    |    TYPEDEF functionTypeAlias
+    :    AUGMENT? TYPEDEF typeIdentifier typeParameters? '=' type ';'
+    |    AUGMENT? TYPEDEF functionTypeAlias
     ;
 
 functionTypeAlias
@@ -1647,6 +1657,7 @@
 
 otherIdentifierNotType
     :    ASYNC
+    |    AUGMENT
     |    BASE
     |    HIDE
     |    OF
@@ -1931,6 +1942,10 @@
     :    'async'
     ;
 
+AUGMENT
+    :    'augment'
+    ;
+
 BASE
     :    'base'
     ;
diff --git a/tools/spec_parser/dart_spec_parser/Dart.g4 b/tools/spec_parser/dart_spec_parser/Dart.g4
index ac8b303..36b5283 100644
--- a/tools/spec_parser/dart_spec_parser/Dart.g4
+++ b/tools/spec_parser/dart_spec_parser/Dart.g4
@@ -4,6 +4,8 @@
 
 // CHANGES:
 //
+// v0.41 Include support for augmentation libraries.
+//
 // v0.40 Include latest changes to mixin related class modifiers.
 //
 // v0.39 Translate actions from Java to Dart.
@@ -272,13 +274,12 @@
     |    EXTERNAL getterSignature ';'
     |    EXTERNAL setterSignature ';'
     |    EXTERNAL finalVarOrType identifierList ';'
-    |    getterSignature functionBody
-    |    setterSignature functionBody
-    |    functionSignature functionBody
-    |    (FINAL | CONST) type? staticFinalDeclarationList ';'
-    |    LATE FINAL type? initializedIdentifierList ';'
-    |    LATE? varOrType identifier ('=' expression)?
-         (',' initializedIdentifier)* ';'
+    |    AUGMENT? getterSignature functionBody
+    |    AUGMENT? setterSignature functionBody
+    |    AUGMENT? functionSignature functionBody
+    |    AUGMENT? (FINAL | CONST) type? staticFinalDeclarationList ';'
+    |    AUGMENT? LATE FINAL type? initializedIdentifierList ';'
+    |    AUGMENT? LATE? varOrType initializedIdentifierList ';'
     ;
 
 declaredIdentifier
@@ -397,7 +398,7 @@
     ;
 
 classDeclaration
-    :    (classModifiers | mixinClassModifiers)
+    :    AUGMENT? (classModifiers | mixinClassModifiers)
          CLASS typeWithParameters superclass? interfaces?
          LBRACE (metadata classMemberDeclaration)* RBRACE
     |    classModifiers MIXIN? CLASS mixinApplicationClass
@@ -426,7 +427,7 @@
     ;
 
 classMemberDeclaration
-    :    methodSignature functionBody
+    :    AUGMENT? methodSignature functionBody
     |    declaration ';'
     ;
 
@@ -435,7 +436,7 @@
     ;
 
 mixinDeclaration
-    :    BASE? MIXIN typeIdentifier typeParameters?
+    :    AUGMENT? BASE? MIXIN typeWithParameters
          (ON typeNotVoidNotFunctionList)? interfaces?
          LBRACE (metadata mixinMemberDeclaration)* RBRACE
     ;
@@ -446,9 +447,8 @@
     ;
 
 extensionTypeDeclaration
-    :    EXTENSION TYPE CONST? typeWithParameters
-         representationDeclaration
-         interfaces?
+    :    AUGMENT? EXTENSION TYPE CONST? typeWithParameters
+         representationDeclaration interfaces?
          LBRACE (metadata extensionTypeMemberDeclaration)* RBRACE
     ;
 
@@ -463,12 +463,12 @@
     ;
 
 extensionDeclaration
-    :    EXTENSION typeIdentifierNotType? typeParameters? ON type
-         LBRACE (metadata extensionMemberDefinition)* RBRACE
+    :    AUGMENT? EXTENSION typeIdentifierNotType? typeParameters? ON type
+         LBRACE (metadata extensionMemberDeclaration)* RBRACE
     ;
 
 // TODO: We might want to make this more strict.
-extensionMemberDefinition
+extensionMemberDeclaration
     :    classMemberDeclaration
     ;
 
@@ -490,17 +490,17 @@
     |    (EXTERNAL STATIC?)? setterSignature
     |    (EXTERNAL STATIC?)? functionSignature
     |    EXTERNAL (STATIC? finalVarOrType | COVARIANT varOrType) identifierList
-    |    ABSTRACT (finalVarOrType | COVARIANT varOrType) identifierList
     |    EXTERNAL? operatorSignature
-    |    STATIC (FINAL | CONST) type? staticFinalDeclarationList
-    |    STATIC LATE FINAL type? initializedIdentifierList
-    |    STATIC LATE? varOrType initializedIdentifierList
-    |    COVARIANT LATE FINAL type? identifierList
-    |    COVARIANT LATE? varOrType initializedIdentifierList
-    |    LATE? (FINAL type? | varOrType) initializedIdentifierList
-    |    redirectingFactoryConstructorSignature
-    |    constantConstructorSignature (redirection | initializers)?
-    |    constructorSignature (redirection | initializers)?
+    |    ABSTRACT (finalVarOrType | COVARIANT varOrType) identifierList
+    |    AUGMENT? STATIC (FINAL | CONST) type? staticFinalDeclarationList
+    |    AUGMENT? STATIC LATE FINAL type? initializedIdentifierList
+    |    AUGMENT? STATIC LATE? varOrType initializedIdentifierList
+    |    AUGMENT? COVARIANT LATE FINAL type? identifierList
+    |    AUGMENT? COVARIANT LATE? varOrType initializedIdentifierList
+    |    AUGMENT? LATE? (FINAL type? | varOrType) initializedIdentifierList
+    |    AUGMENT? redirectingFactoryConstructorSignature
+    |    AUGMENT? constantConstructorSignature (redirection | initializers)?
+    |    AUGMENT? constructorSignature (redirection | initializers)?
     ;
 
 staticFinalDeclarationList
@@ -597,7 +597,7 @@
     ;
 
 enumType
-    :    ENUM typeIdentifier typeParameters? mixins? interfaces? LBRACE
+    :    AUGMENT? ENUM typeWithParameters mixins? interfaces? LBRACE
          enumEntry (',' enumEntry)* (',')?
          (';' (metadata classMemberDeclaration)*)?
          RBRACE
@@ -1366,7 +1366,12 @@
     ;
 
 libraryName
-    :    metadata LIBRARY dottedIdentifierList? ';'
+    :    metadata libraryNameBody ';'
+    ;
+
+libraryNameBody
+    :    LIBRARY dottedIdentifierList?
+    |    AUGMENT LIBRARY uri
     ;
 
 dottedIdentifierList
@@ -1375,6 +1380,7 @@
 
 importOrExport
     :    libraryImport
+    |    libraryAugmentImport
     |    libraryExport
     ;
 
@@ -1382,6 +1388,10 @@
     :    metadata importSpecification
     ;
 
+libraryAugmentImport
+    :    metadata IMPORT AUGMENT uri ';'
+    ;
+
 importSpecification
     :    IMPORT configurableUri (DEFERRED? AS typeIdentifier)? combinator* ';'
     ;
@@ -1493,8 +1503,8 @@
     ;
 
 typeAlias
-    :    TYPEDEF typeIdentifier typeParameters? '=' type ';'
-    |    TYPEDEF functionTypeAlias
+    :    AUGMENT? TYPEDEF typeWithParameters '=' type ';'
+    |    AUGMENT? TYPEDEF functionTypeAlias
     ;
 
 functionTypeAlias
@@ -1653,6 +1663,7 @@
 
 otherIdentifierNotType
     :    ASYNC
+    |    AUGMENT
     |    BASE
     |    HIDE
     |    OF
@@ -1937,6 +1948,10 @@
     :    'async'
     ;
 
+AUGMENT
+    :    'augment'
+    ;
+
 BASE
     :    'base'
     ;
@@ -2217,4 +2232,4 @@
 WS
     :    (' ' | '\t' | '\r' | '\n')+
          { skip(); }
-    ;
\ No newline at end of file
+    ;