Add support for `augment external` and report error for `external augment`.

Change-Id: Ib08dca53ec6f21f9a1b558d326f3b1289a991848
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/517941
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/modifier_context.dart b/pkg/_fe_analyzer_shared/lib/src/parser/modifier_context.dart
index 5d96d95..2580898 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/modifier_context.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/modifier_context.dart
@@ -428,7 +428,7 @@
       } else if (staticToken != null) {
         reportModifierOutOfOrder(next, staticToken!.lexeme);
       } else if (externalToken != null) {
-        reportConflictingModifiers(next, externalToken!);
+        reportModifierOutOfOrder(next, externalToken!.lexeme);
       }
       return next;
     }
@@ -519,8 +519,6 @@
         reportModifierOutOfOrder(next, varFinalOrConst!.lexeme);
       } else if (covariantToken != null) {
         reportModifierOutOfOrder(next, covariantToken!.lexeme);
-      } else if (augmentToken != null) {
-        reportConflictingModifiers(next, augmentToken!);
       }
       return next;
     }
diff --git a/pkg/analyzer/test/src/dart/parser/class_test.dart b/pkg/analyzer/test/src/dart/parser/class_test.dart
index 9fc9d41..18c5795 100644
--- a/pkg/analyzer/test/src/dart/parser/class_test.dart
+++ b/pkg/analyzer/test/src/dart/parser/class_test.dart
@@ -1822,6 +1822,29 @@
 ''');
   }
 
+  test_method_augment_external() {
+    var parseResult = parseTestCodeWithDiagnostics(r'''
+augment class A {
+  augment external void foo();
+}
+''');
+
+    var node = parseResult.findNode.singleMethodDeclaration;
+    assertParsedNodeText(node, r'''
+MethodDeclaration
+  augmentKeyword: augment
+  externalKeyword: external
+  returnType: NamedType
+    name: void
+  name: foo
+  parameters: FormalParameterList
+    leftParenthesis: (
+    rightParenthesis: )
+  body: EmptyFunctionBody
+    semicolon: ;
+''');
+  }
+
   test_method_augment_static() {
     var parseResult = parseTestCodeWithDiagnostics(r'''
 augment class A {
diff --git a/pkg/analyzer/test/src/dart/parser/top_level_function_test.dart b/pkg/analyzer/test/src/dart/parser/top_level_function_test.dart
index 7198fca..6ff5d78 100644
--- a/pkg/analyzer/test/src/dart/parser/top_level_function_test.dart
+++ b/pkg/analyzer/test/src/dart/parser/top_level_function_test.dart
@@ -107,6 +107,28 @@
 ''');
   }
 
+  test_function_augment_external() {
+    var parseResult = parseTestCodeWithDiagnostics(r'''
+augment external void foo();
+''');
+
+    var node = parseResult.findNode.singleFunctionDeclaration;
+    assertParsedNodeText(node, r'''
+FunctionDeclaration
+  augmentKeyword: augment
+  externalKeyword: external
+  returnType: NamedType
+    name: void
+  name: foo
+  functionExpression: FunctionExpression
+    parameters: FormalParameterList
+      leftParenthesis: (
+      rightParenthesis: )
+    body: EmptyFunctionBody
+      semicolon: ;
+''');
+  }
+
   test_function_augment_language305() {
     var parseResult = parseTestCodeWithDiagnostics('''
 // @dart = 3.5
@@ -175,6 +197,30 @@
 ''');
   }
 
+  test_function_external_augment() {
+    var parseResult = parseTestCodeWithDiagnostics(r'''
+external augment void foo();
+//       ^^^^^^^
+// [diag.modifierOutOfOrder] The modifier 'augment' should be before the modifier 'external'.
+''');
+
+    var node = parseResult.findNode.singleFunctionDeclaration;
+    assertParsedNodeText(node, r'''
+FunctionDeclaration
+  augmentKeyword: augment
+  externalKeyword: external
+  returnType: NamedType
+    name: void
+  name: foo
+  functionExpression: FunctionExpression
+    parameters: FormalParameterList
+      leftParenthesis: (
+      rightParenthesis: )
+    body: EmptyFunctionBody
+      semicolon: ;
+''');
+  }
+
   test_getter_abstract() {
     var parseResult = parseTestCodeWithDiagnostics(r'''
 abstract int get foo {}
@@ -259,6 +305,26 @@
 ''');
   }
 
+  test_getter_augment_external() {
+    var parseResult = parseTestCodeWithDiagnostics(r'''
+augment external int get foo;
+''');
+
+    var node = parseResult.findNode.singleFunctionDeclaration;
+    assertParsedNodeText(node, r'''
+FunctionDeclaration
+  augmentKeyword: augment
+  externalKeyword: external
+  returnType: NamedType
+    name: int
+  propertyKeyword: get
+  name: foo
+  functionExpression: FunctionExpression
+    body: EmptyFunctionBody
+      semicolon: ;
+''');
+  }
+
   test_getter_augment_language305() {
     var parseResult = parseTestCodeWithDiagnostics('''
 // @dart = 3.5
@@ -484,6 +550,31 @@
 ''');
   }
 
+  test_setter_augment_external() {
+    var parseResult = parseTestCodeWithDiagnostics(r'''
+augment external set foo(int _);
+''');
+
+    var node = parseResult.findNode.singleFunctionDeclaration;
+    assertParsedNodeText(node, r'''
+FunctionDeclaration
+  augmentKeyword: augment
+  externalKeyword: external
+  propertyKeyword: set
+  name: foo
+  functionExpression: FunctionExpression
+    parameters: FormalParameterList
+      leftParenthesis: (
+      parameter: RegularFormalParameter
+        type: NamedType
+          name: int
+        name: _
+      rightParenthesis: )
+    body: EmptyFunctionBody
+      semicolon: ;
+''');
+  }
+
   test_setter_augment_language305() {
     var parseResult = parseTestCodeWithDiagnostics('''
 // @dart = 3.5
diff --git a/pkg/analyzer/test/src/dart/parser/top_level_variable_test.dart b/pkg/analyzer/test/src/dart/parser/top_level_variable_test.dart
index 1851ee5..1d9105b 100644
--- a/pkg/analyzer/test/src/dart/parser/top_level_variable_test.dart
+++ b/pkg/analyzer/test/src/dart/parser/top_level_variable_test.dart
@@ -128,6 +128,26 @@
 ''');
   }
 
+  test_augment_external() {
+    var parseResult = parseTestCodeWithDiagnostics(r'''
+augment external int foo;
+''');
+
+    var node = parseResult.findNode.singleTopLevelVariableDeclaration;
+    assertParsedNodeText(node, r'''
+TopLevelVariableDeclaration
+  augmentKeyword: augment
+  externalKeyword: external
+  variables: VariableDeclarationList
+    type: NamedType
+      name: int
+    variables
+      VariableDeclaration
+        name: foo
+  semicolon: ;
+''');
+  }
+
   test_augment_language305() {
     var parseResult = parseTestCodeWithDiagnostics('''
 // @dart = 3.5
diff --git a/pkg/analyzer/test/src/diagnostics/deprecated_factory_method_test.dart b/pkg/analyzer/test/src/diagnostics/deprecated_factory_method_test.dart
index 9feefaf..c2fc2e0 100644
--- a/pkg/analyzer/test/src/diagnostics/deprecated_factory_method_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/deprecated_factory_method_test.dart
@@ -81,15 +81,11 @@
   }
 
   test_withModifier_augmentAndExternal_after() async {
-    // TODO(brianwilkerson): The `conflictingModifiers` diagnostic should not
-    //  be produced here.
     await resolveTestCodeWithDiagnostics(r'''
 class C {
   augment external factory();
 //^^^^^^^
 // [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
-//        ^^^^^^^^
-// [diag.conflictingModifiers] Members can't be declared to be both 'external' and 'augment'.
 }
 ''');
   }
diff --git a/pkg/front_end/parser_testcases/augmentation/member_errors.dart.expect b/pkg/front_end/parser_testcases/augmentation/member_errors.dart.expect
index 53576d7..c4b3e73 100644
--- a/pkg/front_end/parser_testcases/augmentation/member_errors.dart.expect
+++ b/pkg/front_end/parser_testcases/augmentation/member_errors.dart.expect
@@ -4,11 +4,7 @@
   augment augment method() {}
           ^^^^^^^
 
-parser/augmentation/member_errors:3:11: Members can't be declared to be both 'external' and 'augment'.
-  augment external method();
-          ^^^^^^^^
-
-parser/augmentation/member_errors:4:12: Members can't be declared to be both 'augment' and 'external'.
+parser/augmentation/member_errors:4:12: The modifier 'augment' should be before the modifier 'external'.
   external augment method();
            ^^^^^^^
 
@@ -16,11 +12,7 @@
   augment augment void method() {}
           ^^^^^^^
 
-parser/augmentation/member_errors:7:11: Members can't be declared to be both 'external' and 'augment'.
-  augment external void method();
-          ^^^^^^^^
-
-parser/augmentation/member_errors:8:12: Members can't be declared to be both 'augment' and 'external'.
+parser/augmentation/member_errors:8:12: The modifier 'augment' should be before the modifier 'external'.
   external augment void method();
            ^^^^^^^
 
@@ -28,11 +20,7 @@
   augment augment get getter => null;
           ^^^^^^^
 
-parser/augmentation/member_errors:11:11: Members can't be declared to be both 'external' and 'augment'.
-  augment external get getter;
-          ^^^^^^^^
-
-parser/augmentation/member_errors:12:12: Members can't be declared to be both 'augment' and 'external'.
+parser/augmentation/member_errors:12:12: The modifier 'augment' should be before the modifier 'external'.
   external augment get getter;
            ^^^^^^^
 
@@ -40,11 +28,7 @@
   augment augment int get getter => 0;
           ^^^^^^^
 
-parser/augmentation/member_errors:15:11: Members can't be declared to be both 'external' and 'augment'.
-  augment external int get getter;
-          ^^^^^^^^
-
-parser/augmentation/member_errors:16:12: Members can't be declared to be both 'augment' and 'external'.
+parser/augmentation/member_errors:16:12: The modifier 'augment' should be before the modifier 'external'.
   external augment int get getter;
            ^^^^^^^
 
@@ -52,11 +36,7 @@
   augment augment set setter(value) {}
           ^^^^^^^
 
-parser/augmentation/member_errors:19:11: Members can't be declared to be both 'external' and 'augment'.
-  augment external set setter(value);
-          ^^^^^^^^
-
-parser/augmentation/member_errors:20:12: Members can't be declared to be both 'augment' and 'external'.
+parser/augmentation/member_errors:20:12: The modifier 'augment' should be before the modifier 'external'.
   external augment set setter(value);
            ^^^^^^^
 
@@ -64,11 +44,7 @@
   augment augment void set setter(value) {}
           ^^^^^^^
 
-parser/augmentation/member_errors:23:11: Members can't be declared to be both 'external' and 'augment'.
-  augment external void set setter(value);
-          ^^^^^^^^
-
-parser/augmentation/member_errors:24:12: Members can't be declared to be both 'augment' and 'external'.
+parser/augmentation/member_errors:24:12: The modifier 'augment' should be before the modifier 'external'.
   external augment void set setter(value);
            ^^^^^^^
 
@@ -76,11 +52,7 @@
   augment augment var field;
           ^^^^^^^
 
-parser/augmentation/member_errors:27:11: Members can't be declared to be both 'external' and 'augment'.
-  augment external var field;
-          ^^^^^^^^
-
-parser/augmentation/member_errors:28:12: Members can't be declared to be both 'augment' and 'external'.
+parser/augmentation/member_errors:28:12: The modifier 'augment' should be before the modifier 'external'.
   external augment var field;
            ^^^^^^^
 
@@ -88,11 +60,7 @@
   augment augment final field = 0;
           ^^^^^^^
 
-parser/augmentation/member_errors:31:11: Members can't be declared to be both 'external' and 'augment'.
-  augment external final field;
-          ^^^^^^^^
-
-parser/augmentation/member_errors:32:12: Members can't be declared to be both 'augment' and 'external'.
+parser/augmentation/member_errors:32:12: The modifier 'augment' should be before the modifier 'external'.
   external augment final field;
            ^^^^^^^
 
@@ -100,15 +68,11 @@
   augment augment const field = 0;
           ^^^^^^^
 
-parser/augmentation/member_errors:35:11: Members can't be declared to be both 'external' and 'augment'.
-  augment external const field;
-          ^^^^^^^^
-
 parser/augmentation/member_errors:35:26: The const variable 'field' must be initialized.
   augment external const field;
                          ^^^^^
 
-parser/augmentation/member_errors:36:12: Members can't be declared to be both 'augment' and 'external'.
+parser/augmentation/member_errors:36:12: The modifier 'augment' should be before the modifier 'external'.
   external augment const field;
            ^^^^^^^
 
@@ -120,11 +84,7 @@
   augment augment int field;
           ^^^^^^^
 
-parser/augmentation/member_errors:39:11: Members can't be declared to be both 'external' and 'augment'.
-  augment external int field;
-          ^^^^^^^^
-
-parser/augmentation/member_errors:40:12: Members can't be declared to be both 'augment' and 'external'.
+parser/augmentation/member_errors:40:12: The modifier 'augment' should be before the modifier 'external'.
   external augment int field;
            ^^^^^^^
 
@@ -276,7 +236,6 @@
         endMember()
         beginMetadataStar(augment)
         endMetadataStar(0)
-        handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
         beginMember()
           beginMethod(DeclarationKind.Class, augment, external, null, null, null, null, method, Class)
             handleNoType(external)
@@ -291,7 +250,7 @@
         endMember()
         beginMetadataStar(external)
         endMetadataStar(0)
-        handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+        handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
         beginMember()
           beginMethod(DeclarationKind.Class, null, external, null, null, null, null, method, Class)
             handleNoType(augment)
@@ -322,7 +281,6 @@
         endMember()
         beginMetadataStar(augment)
         endMetadataStar(0)
-        handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
         beginMember()
           beginMethod(DeclarationKind.Class, augment, external, null, null, null, null, method, Class)
             handleVoidKeyword(void)
@@ -337,7 +295,7 @@
         endMember()
         beginMetadataStar(external)
         endMetadataStar(0)
-        handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+        handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
         beginMember()
           beginMethod(DeclarationKind.Class, null, external, null, null, null, null, method, Class)
             handleVoidKeyword(void)
@@ -367,7 +325,6 @@
         endMember()
         beginMetadataStar(augment)
         endMetadataStar(0)
-        handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
         beginMember()
           beginMethod(DeclarationKind.Class, augment, external, null, null, null, get, getter, Class)
             handleNoType(external)
@@ -381,7 +338,7 @@
         endMember()
         beginMetadataStar(external)
         endMetadataStar(0)
-        handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+        handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
         beginMember()
           beginMethod(DeclarationKind.Class, null, external, null, null, null, get, getter, Class)
             handleNoType(augment)
@@ -412,7 +369,6 @@
         endMember()
         beginMetadataStar(augment)
         endMetadataStar(0)
-        handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
         beginMember()
           beginMethod(DeclarationKind.Class, augment, external, null, null, null, get, getter, Class)
             handleIdentifier(int, typeReference)
@@ -428,7 +384,7 @@
         endMember()
         beginMetadataStar(external)
         endMetadataStar(0)
-        handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+        handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
         beginMember()
           beginMethod(DeclarationKind.Class, null, external, null, null, null, get, getter, Class)
             handleIdentifier(int, typeReference)
@@ -467,7 +423,6 @@
         endMember()
         beginMetadataStar(augment)
         endMetadataStar(0)
-        handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
         beginMember()
           beginMethod(DeclarationKind.Class, augment, external, null, null, null, set, setter, Class)
             handleNoType(external)
@@ -489,7 +444,7 @@
         endMember()
         beginMetadataStar(external)
         endMetadataStar(0)
-        handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+        handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
         beginMember()
           beginMethod(DeclarationKind.Class, null, external, null, null, null, set, setter, Class)
             handleNoType(augment)
@@ -534,7 +489,6 @@
         endMember()
         beginMetadataStar(augment)
         endMetadataStar(0)
-        handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
         beginMember()
           beginMethod(DeclarationKind.Class, augment, external, null, null, null, set, setter, Class)
             handleVoidKeyword(void)
@@ -556,7 +510,7 @@
         endMember()
         beginMetadataStar(external)
         endMetadataStar(0)
-        handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+        handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
         beginMember()
           beginMethod(DeclarationKind.Class, null, external, null, null, null, set, setter, Class)
             handleVoidKeyword(void)
@@ -588,7 +542,6 @@
         endMember()
         beginMetadataStar(augment)
         endMetadataStar(0)
-        handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
         beginMember()
           beginFields(DeclarationKind.Class, augment, null, external, null, null, null, var, ;)
             handleNoType(var)
@@ -598,7 +551,7 @@
         endMember()
         beginMetadataStar(external)
         endMetadataStar(0)
-        handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+        handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
         beginMember()
           beginFields(DeclarationKind.Class, null, null, external, null, null, null, var, ;)
             handleNoType(var)
@@ -620,7 +573,6 @@
         endMember()
         beginMetadataStar(augment)
         endMetadataStar(0)
-        handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
         beginMember()
           beginFields(DeclarationKind.Class, augment, null, external, null, null, null, final, ;)
             handleNoType(final)
@@ -630,7 +582,7 @@
         endMember()
         beginMetadataStar(external)
         endMetadataStar(0)
-        handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+        handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
         beginMember()
           beginFields(DeclarationKind.Class, null, null, external, null, null, null, final, ;)
             handleNoType(final)
@@ -652,7 +604,6 @@
         endMember()
         beginMetadataStar(augment)
         endMetadataStar(0)
-        handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
         beginMember()
           beginFields(DeclarationKind.Class, augment, null, external, null, null, null, const, ;)
             handleNoType(const)
@@ -663,7 +614,7 @@
         endMember()
         beginMetadataStar(external)
         endMetadataStar(0)
-        handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+        handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
         beginMember()
           beginFields(DeclarationKind.Class, null, null, external, null, null, null, const, ;)
             handleNoType(const)
@@ -686,7 +637,6 @@
         endMember()
         beginMetadataStar(augment)
         endMetadataStar(0)
-        handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
         beginMember()
           beginFields(DeclarationKind.Class, augment, null, external, null, null, null, null, ;)
             handleIdentifier(int, typeReference)
@@ -698,7 +648,7 @@
         endMember()
         beginMetadataStar(external)
         endMetadataStar(0)
-        handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+        handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
         beginMember()
           beginFields(DeclarationKind.Class, null, null, external, null, null, null, null, ;)
             handleIdentifier(int, typeReference)
diff --git a/pkg/front_end/parser_testcases/augmentation/member_errors.dart.intertwined.expect b/pkg/front_end/parser_testcases/augmentation/member_errors.dart.intertwined.expect
index 268080d..bb4ca75 100644
--- a/pkg/front_end/parser_testcases/augmentation/member_errors.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/augmentation/member_errors.dart.intertwined.expect
@@ -66,8 +66,6 @@
               parseMetadataStar(})
                 listener: beginMetadataStar(augment)
                 listener: endMetadataStar(0)
-              reportRecoverableError(external, Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}])
-                listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
               listener: beginMember()
               isReservedKeyword(()
               parseMethod(}, null, augment, external, null, null, null, null, external, NoType(), null, null, method, DeclarationKind.Class, Class, false)
@@ -98,8 +96,8 @@
               parseMetadataStar(;)
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
-              reportRecoverableError(augment, Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}])
-                listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+              reportRecoverableError(augment, Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}])
+                listener: handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
               listener: beginMember()
               isReservedKeyword(()
               parseMethod(;, null, null, external, null, null, null, null, augment, NoType(), null, null, method, DeclarationKind.Class, Class, false)
@@ -163,8 +161,6 @@
               parseMetadataStar(})
                 listener: beginMetadataStar(augment)
                 listener: endMetadataStar(0)
-              reportRecoverableError(external, Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}])
-                listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
               listener: beginMember()
               parseMethod(}, null, augment, external, null, null, null, null, external, VoidType(), null, null, method, DeclarationKind.Class, Class, false)
                 listener: beginMethod(DeclarationKind.Class, augment, external, null, null, null, null, method, Class)
@@ -194,8 +190,8 @@
               parseMetadataStar(;)
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
-              reportRecoverableError(augment, Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}])
-                listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+              reportRecoverableError(augment, Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}])
+                listener: handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
               listener: beginMember()
               parseMethod(;, null, null, external, null, null, null, null, augment, VoidType(), null, null, method, DeclarationKind.Class, Class, false)
                 listener: beginMethod(DeclarationKind.Class, null, external, null, null, null, null, method, Class)
@@ -264,8 +260,6 @@
               parseMetadataStar(;)
                 listener: beginMetadataStar(augment)
                 listener: endMetadataStar(0)
-              reportRecoverableError(external, Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}])
-                listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
               listener: beginMember()
               parseMethod(;, null, augment, external, null, null, null, null, external, NoType(), get, null, getter, DeclarationKind.Class, Class, false)
                 listener: beginMethod(DeclarationKind.Class, augment, external, null, null, null, get, getter, Class)
@@ -292,8 +286,8 @@
               parseMetadataStar(;)
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
-              reportRecoverableError(augment, Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}])
-                listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+              reportRecoverableError(augment, Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}])
+                listener: handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
               listener: beginMember()
               parseMethod(;, null, null, external, null, null, null, null, augment, NoType(), get, null, getter, DeclarationKind.Class, Class, false)
                 listener: beginMethod(DeclarationKind.Class, null, external, null, null, null, get, getter, Class)
@@ -361,8 +355,6 @@
               parseMetadataStar(;)
                 listener: beginMetadataStar(augment)
                 listener: endMetadataStar(0)
-              reportRecoverableError(external, Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}])
-                listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
               listener: beginMember()
               parseMethod(;, null, augment, external, null, null, null, null, external, SimpleType(), get, null, getter, DeclarationKind.Class, Class, false)
                 listener: beginMethod(DeclarationKind.Class, augment, external, null, null, null, get, getter, Class)
@@ -391,8 +383,8 @@
               parseMetadataStar(;)
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
-              reportRecoverableError(augment, Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}])
-                listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+              reportRecoverableError(augment, Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}])
+                listener: handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
               listener: beginMember()
               parseMethod(;, null, null, external, null, null, null, null, augment, SimpleType(), get, null, getter, DeclarationKind.Class, Class, false)
                 listener: beginMethod(DeclarationKind.Class, null, external, null, null, null, get, getter, Class)
@@ -464,8 +456,6 @@
               parseMetadataStar(})
                 listener: beginMetadataStar(augment)
                 listener: endMetadataStar(0)
-              reportRecoverableError(external, Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}])
-                listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
               listener: beginMember()
               parseMethod(}, null, augment, external, null, null, null, null, external, NoType(), set, null, setter, DeclarationKind.Class, Class, false)
                 listener: beginMethod(DeclarationKind.Class, augment, external, null, null, null, set, setter, Class)
@@ -505,8 +495,8 @@
               parseMetadataStar(;)
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
-              reportRecoverableError(augment, Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}])
-                listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+              reportRecoverableError(augment, Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}])
+                listener: handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
               listener: beginMember()
               parseMethod(;, null, null, external, null, null, null, null, augment, NoType(), set, null, setter, DeclarationKind.Class, Class, false)
                 listener: beginMethod(DeclarationKind.Class, null, external, null, null, null, set, setter, Class)
@@ -589,8 +579,6 @@
               parseMetadataStar(})
                 listener: beginMetadataStar(augment)
                 listener: endMetadataStar(0)
-              reportRecoverableError(external, Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}])
-                listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
               listener: beginMember()
               parseMethod(}, null, augment, external, null, null, null, null, external, VoidType(), set, null, setter, DeclarationKind.Class, Class, false)
                 listener: beginMethod(DeclarationKind.Class, augment, external, null, null, null, set, setter, Class)
@@ -630,8 +618,8 @@
               parseMetadataStar(;)
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
-              reportRecoverableError(augment, Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}])
-                listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+              reportRecoverableError(augment, Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}])
+                listener: handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
               listener: beginMember()
               parseMethod(;, null, null, external, null, null, null, null, augment, VoidType(), set, null, setter, DeclarationKind.Class, Class, false)
                 listener: beginMethod(DeclarationKind.Class, null, external, null, null, null, set, setter, Class)
@@ -690,8 +678,6 @@
               parseMetadataStar(;)
                 listener: beginMetadataStar(augment)
                 listener: endMetadataStar(0)
-              reportRecoverableError(external, Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}])
-                listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
               listener: beginMember()
               skipOuterPattern(var)
                 skipObjectPatternRest(field)
@@ -709,8 +695,8 @@
               parseMetadataStar(;)
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
-              reportRecoverableError(augment, Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}])
-                listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+              reportRecoverableError(augment, Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}])
+                listener: handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
               listener: beginMember()
               skipOuterPattern(var)
                 skipObjectPatternRest(field)
@@ -756,8 +742,6 @@
               parseMetadataStar(;)
                 listener: beginMetadataStar(augment)
                 listener: endMetadataStar(0)
-              reportRecoverableError(external, Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}])
-                listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
               listener: beginMember()
               skipOuterPattern(final)
                 skipObjectPatternRest(field)
@@ -775,8 +759,8 @@
               parseMetadataStar(;)
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
-              reportRecoverableError(augment, Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}])
-                listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+              reportRecoverableError(augment, Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}])
+                listener: handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
               listener: beginMember()
               skipOuterPattern(final)
                 skipObjectPatternRest(field)
@@ -820,8 +804,6 @@
               parseMetadataStar(;)
                 listener: beginMetadataStar(augment)
                 listener: endMetadataStar(0)
-              reportRecoverableError(external, Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}])
-                listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
               listener: beginMember()
               parseFields(;, null, augment, external, null, null, null, const, const, NoType(), field, DeclarationKind.Class, Class, false)
                 listener: beginFields(DeclarationKind.Class, augment, null, external, null, null, null, const, ;)
@@ -839,8 +821,8 @@
               parseMetadataStar(;)
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
-              reportRecoverableError(augment, Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}])
-                listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+              reportRecoverableError(augment, Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}])
+                listener: handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
               listener: beginMember()
               parseFields(;, null, null, external, null, null, null, const, const, NoType(), field, DeclarationKind.Class, Class, false)
                 listener: beginFields(DeclarationKind.Class, null, null, external, null, null, null, const, ;)
@@ -877,8 +859,6 @@
               parseMetadataStar(;)
                 listener: beginMetadataStar(augment)
                 listener: endMetadataStar(0)
-              reportRecoverableError(external, Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}])
-                listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
               listener: beginMember()
               parseFields(;, null, augment, external, null, null, null, null, external, SimpleType(), field, DeclarationKind.Class, Class, false)
                 listener: beginFields(DeclarationKind.Class, augment, null, external, null, null, null, null, ;)
@@ -896,8 +876,8 @@
               parseMetadataStar(;)
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
-              reportRecoverableError(augment, Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}])
-                listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+              reportRecoverableError(augment, Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}])
+                listener: handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
               listener: beginMember()
               parseFields(;, null, null, external, null, null, null, null, augment, SimpleType(), field, DeclarationKind.Class, Class, false)
                 listener: beginFields(DeclarationKind.Class, null, null, external, null, null, null, null, ;)
diff --git a/pkg/front_end/parser_testcases/augmentation/top_level_errors.dart.expect b/pkg/front_end/parser_testcases/augmentation/top_level_errors.dart.expect
index d23e652..0847582 100644
--- a/pkg/front_end/parser_testcases/augmentation/top_level_errors.dart.expect
+++ b/pkg/front_end/parser_testcases/augmentation/top_level_errors.dart.expect
@@ -4,11 +4,7 @@
 augment augment method() {}
         ^^^^^^^
 
-parser/augmentation/top_level_errors:2:9: Members can't be declared to be both 'external' and 'augment'.
-augment external method();
-        ^^^^^^^^
-
-parser/augmentation/top_level_errors:3:10: Members can't be declared to be both 'augment' and 'external'.
+parser/augmentation/top_level_errors:3:10: The modifier 'augment' should be before the modifier 'external'.
 external augment method();
          ^^^^^^^
 
@@ -16,11 +12,7 @@
 augment augment void method() {}
         ^^^^^^^
 
-parser/augmentation/top_level_errors:6:9: Members can't be declared to be both 'external' and 'augment'.
-augment external void method();
-        ^^^^^^^^
-
-parser/augmentation/top_level_errors:7:10: Members can't be declared to be both 'augment' and 'external'.
+parser/augmentation/top_level_errors:7:10: The modifier 'augment' should be before the modifier 'external'.
 external augment void method();
          ^^^^^^^
 
@@ -28,11 +20,7 @@
 augment augment get getter => null;
         ^^^^^^^
 
-parser/augmentation/top_level_errors:10:9: Members can't be declared to be both 'external' and 'augment'.
-augment external get getter;
-        ^^^^^^^^
-
-parser/augmentation/top_level_errors:11:10: Members can't be declared to be both 'augment' and 'external'.
+parser/augmentation/top_level_errors:11:10: The modifier 'augment' should be before the modifier 'external'.
 external augment get getter;
          ^^^^^^^
 
@@ -40,11 +28,7 @@
 augment augment int get getter => 0;
         ^^^^^^^
 
-parser/augmentation/top_level_errors:14:9: Members can't be declared to be both 'external' and 'augment'.
-augment external int get getter;
-        ^^^^^^^^
-
-parser/augmentation/top_level_errors:15:10: Members can't be declared to be both 'augment' and 'external'.
+parser/augmentation/top_level_errors:15:10: The modifier 'augment' should be before the modifier 'external'.
 external augment int get getter;
          ^^^^^^^
 
@@ -52,11 +36,7 @@
 augment augment set setter(value) {}
         ^^^^^^^
 
-parser/augmentation/top_level_errors:18:9: Members can't be declared to be both 'external' and 'augment'.
-augment external set setter(value);
-        ^^^^^^^^
-
-parser/augmentation/top_level_errors:19:10: Members can't be declared to be both 'augment' and 'external'.
+parser/augmentation/top_level_errors:19:10: The modifier 'augment' should be before the modifier 'external'.
 external augment set setter(value);
          ^^^^^^^
 
@@ -64,11 +44,7 @@
 augment augment void set setter(value) {}
         ^^^^^^^
 
-parser/augmentation/top_level_errors:22:9: Members can't be declared to be both 'external' and 'augment'.
-augment external void set setter(value);
-        ^^^^^^^^
-
-parser/augmentation/top_level_errors:23:10: Members can't be declared to be both 'augment' and 'external'.
+parser/augmentation/top_level_errors:23:10: The modifier 'augment' should be before the modifier 'external'.
 external augment void set setter(value);
          ^^^^^^^
 
@@ -76,11 +52,7 @@
 augment augment var field;
         ^^^^^^^
 
-parser/augmentation/top_level_errors:26:9: Members can't be declared to be both 'external' and 'augment'.
-augment external var field;
-        ^^^^^^^^
-
-parser/augmentation/top_level_errors:27:10: Members can't be declared to be both 'augment' and 'external'.
+parser/augmentation/top_level_errors:27:10: The modifier 'augment' should be before the modifier 'external'.
 external augment var field;
          ^^^^^^^
 
@@ -88,11 +60,7 @@
 augment augment int field = 0;
         ^^^^^^^
 
-parser/augmentation/top_level_errors:30:9: Members can't be declared to be both 'external' and 'augment'.
-augment external int field;
-        ^^^^^^^^
-
-parser/augmentation/top_level_errors:31:10: Members can't be declared to be both 'augment' and 'external'.
+parser/augmentation/top_level_errors:31:10: The modifier 'augment' should be before the modifier 'external'.
 external augment int field;
          ^^^^^^^
 
@@ -151,7 +119,6 @@
   beginMetadataStar(augment)
   endMetadataStar(0)
   beginTopLevelMember(augment)
-    handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
     beginTopLevelMethod(}, augment, external)
       handleNoType(external)
       handleIdentifier(method, topLevelFunctionDeclaration)
@@ -165,7 +132,7 @@
   beginMetadataStar(external)
   endMetadataStar(0)
   beginTopLevelMember(external)
-    handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+    handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
     beginTopLevelMethod(;, augment, external)
       handleNoType(augment)
       handleIdentifier(method, topLevelFunctionDeclaration)
@@ -194,7 +161,6 @@
   beginMetadataStar(augment)
   endMetadataStar(0)
   beginTopLevelMember(augment)
-    handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
     beginTopLevelMethod(}, augment, external)
       handleVoidKeyword(void)
       handleIdentifier(method, topLevelFunctionDeclaration)
@@ -208,7 +174,7 @@
   beginMetadataStar(external)
   endMetadataStar(0)
   beginTopLevelMember(external)
-    handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+    handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
     beginTopLevelMethod(;, augment, external)
       handleVoidKeyword(void)
       handleIdentifier(method, topLevelFunctionDeclaration)
@@ -236,7 +202,6 @@
   beginMetadataStar(augment)
   endMetadataStar(0)
   beginTopLevelMember(augment)
-    handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
     beginTopLevelMethod(;, augment, external)
       handleNoType(external)
       handleIdentifier(getter, topLevelFunctionDeclaration)
@@ -249,7 +214,7 @@
   beginMetadataStar(external)
   endMetadataStar(0)
   beginTopLevelMember(external)
-    handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+    handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
     beginTopLevelMethod(;, augment, external)
       handleNoType(augment)
       handleIdentifier(getter, topLevelFunctionDeclaration)
@@ -278,7 +243,6 @@
   beginMetadataStar(augment)
   endMetadataStar(0)
   beginTopLevelMember(augment)
-    handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
     beginTopLevelMethod(;, augment, external)
       handleIdentifier(int, typeReference)
       handleNoTypeArguments(get)
@@ -293,7 +257,7 @@
   beginMetadataStar(external)
   endMetadataStar(0)
   beginTopLevelMember(external)
-    handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+    handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
     beginTopLevelMethod(;, augment, external)
       handleIdentifier(int, typeReference)
       handleNoTypeArguments(get)
@@ -330,7 +294,6 @@
   beginMetadataStar(augment)
   endMetadataStar(0)
   beginTopLevelMember(augment)
-    handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
     beginTopLevelMethod(}, augment, external)
       handleNoType(external)
       handleIdentifier(setter, topLevelFunctionDeclaration)
@@ -351,7 +314,7 @@
   beginMetadataStar(external)
   endMetadataStar(0)
   beginTopLevelMember(external)
-    handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+    handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
     beginTopLevelMethod(;, augment, external)
       handleNoType(augment)
       handleIdentifier(setter, topLevelFunctionDeclaration)
@@ -394,7 +357,6 @@
   beginMetadataStar(augment)
   endMetadataStar(0)
   beginTopLevelMember(augment)
-    handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
     beginTopLevelMethod(}, augment, external)
       handleVoidKeyword(void)
       handleIdentifier(setter, topLevelFunctionDeclaration)
@@ -415,7 +377,7 @@
   beginMetadataStar(external)
   endMetadataStar(0)
   beginTopLevelMember(external)
-    handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+    handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
     beginTopLevelMethod(;, augment, external)
       handleVoidKeyword(void)
       handleIdentifier(setter, topLevelFunctionDeclaration)
@@ -446,7 +408,6 @@
   beginMetadataStar(augment)
   endMetadataStar(0)
   beginTopLevelMember(augment)
-    handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
     beginFields(DeclarationKind.TopLevel, augment, null, external, null, null, null, var, ;)
       handleNoType(var)
       handleIdentifier(field, topLevelVariableDeclaration)
@@ -456,7 +417,7 @@
   beginMetadataStar(external)
   endMetadataStar(0)
   beginTopLevelMember(external)
-    handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+    handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
     beginFields(DeclarationKind.TopLevel, augment, null, external, null, null, null, var, ;)
       handleNoType(var)
       handleIdentifier(field, topLevelVariableDeclaration)
@@ -480,7 +441,6 @@
   beginMetadataStar(augment)
   endMetadataStar(0)
   beginTopLevelMember(augment)
-    handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
     beginFields(DeclarationKind.TopLevel, augment, null, external, null, null, null, null, ;)
       handleIdentifier(int, typeReference)
       handleNoTypeArguments(field)
@@ -492,7 +452,7 @@
   beginMetadataStar(external)
   endMetadataStar(0)
   beginTopLevelMember(external)
-    handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+    handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
     beginFields(DeclarationKind.TopLevel, augment, null, external, null, null, null, null, ;)
       handleIdentifier(int, typeReference)
       handleNoTypeArguments(field)
diff --git a/pkg/front_end/parser_testcases/augmentation/top_level_errors.dart.intertwined.expect b/pkg/front_end/parser_testcases/augmentation/top_level_errors.dart.intertwined.expect
index de09636..84e8377 100644
--- a/pkg/front_end/parser_testcases/augmentation/top_level_errors.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/augmentation/top_level_errors.dart.intertwined.expect
@@ -38,8 +38,6 @@
       listener: endMetadataStar(0)
     parseTopLevelMemberImpl(})
       listener: beginTopLevelMember(augment)
-      reportRecoverableError(external, Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}])
-        listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
       isReservedKeyword(()
       parseTopLevelMethod(}, augment, external, external, NoType(), null, method, false)
         listener: beginTopLevelMethod(}, augment, external)
@@ -66,8 +64,8 @@
       listener: endMetadataStar(0)
     parseTopLevelMemberImpl(;)
       listener: beginTopLevelMember(external)
-      reportRecoverableError(augment, Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}])
-        listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+      reportRecoverableError(augment, Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}])
+        listener: handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
       isReservedKeyword(()
       parseTopLevelMethod(;, augment, external, augment, NoType(), null, method, false)
         listener: beginTopLevelMethod(;, augment, external)
@@ -123,8 +121,6 @@
       listener: endMetadataStar(0)
     parseTopLevelMemberImpl(})
       listener: beginTopLevelMember(augment)
-      reportRecoverableError(external, Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}])
-        listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
       parseTopLevelMethod(}, augment, external, external, VoidType(), null, method, false)
         listener: beginTopLevelMethod(}, augment, external)
         listener: handleVoidKeyword(void)
@@ -150,8 +146,8 @@
       listener: endMetadataStar(0)
     parseTopLevelMemberImpl(;)
       listener: beginTopLevelMember(external)
-      reportRecoverableError(augment, Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}])
-        listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+      reportRecoverableError(augment, Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}])
+        listener: handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
       parseTopLevelMethod(;, augment, external, augment, VoidType(), null, method, false)
         listener: beginTopLevelMethod(;, augment, external)
         listener: handleVoidKeyword(void)
@@ -213,8 +209,6 @@
       listener: endMetadataStar(0)
     parseTopLevelMemberImpl(;)
       listener: beginTopLevelMember(augment)
-      reportRecoverableError(external, Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}])
-        listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
       isReservedKeyword(;)
       parseTopLevelMethod(;, augment, external, external, NoType(), get, getter, false)
         listener: beginTopLevelMethod(;, augment, external)
@@ -238,8 +232,8 @@
       listener: endMetadataStar(0)
     parseTopLevelMemberImpl(;)
       listener: beginTopLevelMember(external)
-      reportRecoverableError(augment, Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}])
-        listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+      reportRecoverableError(augment, Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}])
+        listener: handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
       isReservedKeyword(;)
       parseTopLevelMethod(;, augment, external, augment, NoType(), get, getter, false)
         listener: beginTopLevelMethod(;, augment, external)
@@ -300,8 +294,6 @@
       listener: endMetadataStar(0)
     parseTopLevelMemberImpl(;)
       listener: beginTopLevelMember(augment)
-      reportRecoverableError(external, Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}])
-        listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
       parseTopLevelMethod(;, augment, external, external, SimpleType(), get, getter, false)
         listener: beginTopLevelMethod(;, augment, external)
         listener: handleIdentifier(int, typeReference)
@@ -326,8 +318,8 @@
       listener: endMetadataStar(0)
     parseTopLevelMemberImpl(;)
       listener: beginTopLevelMember(external)
-      reportRecoverableError(augment, Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}])
-        listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+      reportRecoverableError(augment, Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}])
+        listener: handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
       parseTopLevelMethod(;, augment, external, augment, SimpleType(), get, getter, false)
         listener: beginTopLevelMethod(;, augment, external)
         listener: handleIdentifier(int, typeReference)
@@ -392,8 +384,6 @@
       listener: endMetadataStar(0)
     parseTopLevelMemberImpl(})
       listener: beginTopLevelMember(augment)
-      reportRecoverableError(external, Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}])
-        listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
       isReservedKeyword(()
       parseTopLevelMethod(}, augment, external, external, NoType(), set, setter, false)
         listener: beginTopLevelMethod(}, augment, external)
@@ -430,8 +420,8 @@
       listener: endMetadataStar(0)
     parseTopLevelMemberImpl(;)
       listener: beginTopLevelMember(external)
-      reportRecoverableError(augment, Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}])
-        listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+      reportRecoverableError(augment, Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}])
+        listener: handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
       isReservedKeyword(()
       parseTopLevelMethod(;, augment, external, augment, NoType(), set, setter, false)
         listener: beginTopLevelMethod(;, augment, external)
@@ -507,8 +497,6 @@
       listener: endMetadataStar(0)
     parseTopLevelMemberImpl(})
       listener: beginTopLevelMember(augment)
-      reportRecoverableError(external, Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}])
-        listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
       parseTopLevelMethod(}, augment, external, external, VoidType(), set, setter, false)
         listener: beginTopLevelMethod(}, augment, external)
         listener: handleVoidKeyword(void)
@@ -544,8 +532,8 @@
       listener: endMetadataStar(0)
     parseTopLevelMemberImpl(;)
       listener: beginTopLevelMember(external)
-      reportRecoverableError(augment, Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}])
-        listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+      reportRecoverableError(augment, Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}])
+        listener: handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
       parseTopLevelMethod(;, augment, external, augment, VoidType(), set, setter, false)
         listener: beginTopLevelMethod(;, augment, external)
         listener: handleVoidKeyword(void)
@@ -600,8 +588,6 @@
       listener: endMetadataStar(0)
     parseTopLevelMemberImpl(;)
       listener: beginTopLevelMember(augment)
-      reportRecoverableError(external, Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}])
-        listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
       skipOuterPattern(var)
         skipObjectPatternRest(field)
       parseFields(;, null, augment, external, null, null, null, var, var, NoType(), field, DeclarationKind.TopLevel, null, false)
@@ -619,8 +605,8 @@
       listener: endMetadataStar(0)
     parseTopLevelMemberImpl(;)
       listener: beginTopLevelMember(external)
-      reportRecoverableError(augment, Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}])
-        listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+      reportRecoverableError(augment, Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}])
+        listener: handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
       skipOuterPattern(var)
         skipObjectPatternRest(field)
       parseFields(;, null, augment, external, null, null, null, var, var, NoType(), field, DeclarationKind.TopLevel, null, false)
@@ -666,8 +652,6 @@
       listener: endMetadataStar(0)
     parseTopLevelMemberImpl(;)
       listener: beginTopLevelMember(augment)
-      reportRecoverableError(external, Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}])
-        listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'external' and 'augment'., Try removing one of the keywords., {modifier: external, earlierModifier: augment}], external, external)
       parseFields(;, null, augment, external, null, null, null, null, external, SimpleType(), field, DeclarationKind.TopLevel, null, false)
         listener: beginFields(DeclarationKind.TopLevel, augment, null, external, null, null, null, null, ;)
         listener: handleIdentifier(int, typeReference)
@@ -685,8 +669,8 @@
       listener: endMetadataStar(0)
     parseTopLevelMemberImpl(;)
       listener: beginTopLevelMember(external)
-      reportRecoverableError(augment, Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}])
-        listener: handleRecoverableError(Message[Template(ConflictingModifiers), Members can't be declared to be both 'augment' and 'external'., Try removing one of the keywords., {modifier: augment, earlierModifier: external}], augment, augment)
+      reportRecoverableError(augment, Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}])
+        listener: handleRecoverableError(Message[Template(ModifierOutOfOrder), The modifier 'augment' should be before the modifier 'external'., Try re-ordering the modifiers., {modifier: augment, expectedLaterModifier: external}], augment, augment)
       parseFields(;, null, augment, external, null, null, null, null, augment, SimpleType(), field, DeclarationKind.TopLevel, null, false)
         listener: beginFields(DeclarationKind.TopLevel, augment, null, external, null, null, null, null, ;)
         listener: handleIdentifier(int, typeReference)