[parser/scanner] Remove ScannerConfig `enableNonNullable`

Change-Id: If6bfbb65a02ac1a4f5708ab9e8c4d66c19ecff86
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/403984
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Jens Johansen <jensj@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
index dbc8460f..6985248 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
@@ -1897,44 +1897,6 @@
     }
   }
 
-  /// Check if [token] is the usage of 'required' in a formal parameter in a
-  /// context where it's not legal (i.e. in non-nnbd-mode).
-  bool _isUseOfRequiredInNonNNBD(Token token) {
-    if (token.next is StringToken && token.next!.value() == "required") {
-      // Possible recovery: Figure out if we're in a situation like
-      // required covariant? <type> name
-      // (in non-nnbd-mode) where the required modifier is not legal and thus
-      // would normally be parsed as the type.
-      token = token.next!;
-      Token next = token.next!;
-      // Skip modifiers.
-      while (next.isModifier) {
-        token = next;
-        next = next.next!;
-      }
-      // Parse the (potential) new type.
-      TypeInfo typeInfoAlternative = computeType(
-        token,
-        /* required = */ false,
-        /* inDeclaration = */ true,
-      );
-      token = typeInfoAlternative.skipType(token);
-      next = token.next!;
-
-      // We've essentially ignored the 'required' at this point.
-      // `token` is (in the good state) the last token of the type,
-      // `next` is (in the good state) the name;
-      // Are we in a 'good' state?
-      if (typeInfoAlternative != noType &&
-          next.isIdentifier &&
-          (next.next!.isA(TokenType.COMMA) ||
-              next.next!.isA(TokenType.CLOSE_CURLY_BRACKET))) {
-        return true;
-      }
-    }
-    return false;
-  }
-
   /// ```
   /// normalFormalParameter:
   ///   functionFormalParameter |
@@ -1959,13 +1921,6 @@
     token = parseMetadataStar(token);
 
     Token? skippedNonRequiredRequired;
-    if (_isUseOfRequiredInNonNNBD(token)) {
-      skippedNonRequiredRequired = token.next!;
-      reportRecoverableErrorWithToken(skippedNonRequiredRequired,
-          codes.templateUnexpectedModifierInNonNnbd);
-      token = token.next!;
-    }
-
     Token next = token.next!;
     Token start = next;
 
@@ -3419,42 +3374,6 @@
     return parseTopLevelMemberImpl(token).next!;
   }
 
-  /// Check if [token] is the usage of 'late' before a field declaration in a
-  /// context where it's not legal (i.e. in non-nnbd-mode).
-  bool _isUseOfLateInNonNNBD(Token token) {
-    if (token is StringToken && token.value() == "late") {
-      // Possible recovery: Figure out if we're in a situation like
-      // late final? <type>/var/const name [...]
-      // (in non-nnbd-mode) where the late modifier is not legal and thus would
-      // normally be parsed as the type.
-      Token next = token.next!;
-      // Skip modifiers.
-      while (next.isModifier) {
-        token = next;
-        next = next.next!;
-      }
-      // Parse the (potential) new type.
-      TypeInfo typeInfoAlternative = computeType(
-        token,
-        /* required = */ false,
-        /* inDeclaration = */ true,
-      );
-      token = typeInfoAlternative.skipType(token);
-      next = token.next!;
-
-      // We've essentially ignored the 'late' at this point.
-      // `token` is (in the good state) the last token of the type,
-      // `next` is (in the good state) the name;
-      // Are we in a 'good' state?
-      if (typeInfoAlternative != noType &&
-          next.isIdentifier &&
-          indicatesMethodOrField(next.next!)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
   Token parseTopLevelMemberImpl(Token token) {
     Token beforeStart = token;
     Token next = token.next!;
@@ -3462,15 +3381,6 @@
 
     Token? skippedNonLateLate;
 
-    if (_isUseOfLateInNonNNBD(next)) {
-      skippedNonLateLate = next;
-      reportRecoverableErrorWithToken(
-          skippedNonLateLate, codes.templateUnexpectedModifierInNonNnbd);
-      token = token.next!;
-      beforeStart = token;
-      next = token.next!;
-    }
-
     Token? externalToken;
     Token? augmentToken;
     Token? lateToken;
@@ -4507,14 +4417,6 @@
 
     Token? skippedNonLateLate;
 
-    if (_isUseOfLateInNonNNBD(token.next!)) {
-      skippedNonLateLate = token.next!;
-      reportRecoverableErrorWithToken(
-          skippedNonLateLate, codes.templateUnexpectedModifierInNonNnbd);
-      token = token.next!;
-      beforeStart = token;
-    }
-
     Token? covariantToken;
     Token? abstractToken;
     Token? augmentToken;
@@ -8149,24 +8051,6 @@
   Token parseExpressionStatementOrDeclarationAfterModifiers(Token beforeType,
       Token start, Token? lateToken, Token? varFinalOrConst, TypeInfo? typeInfo,
       [ForPartsContext? forPartsContext]) {
-    // In simple cases check for bad 'late' modifier in non-nnbd-mode.
-    if (typeInfo == null &&
-        lateToken == null &&
-        varFinalOrConst == null &&
-        beforeType == start &&
-        _isUseOfLateInNonNNBD(beforeType.next!)) {
-      lateToken = beforeType.next!;
-      reportRecoverableErrorWithToken(
-          lateToken, codes.templateUnexpectedModifierInNonNnbd);
-      beforeType = start = beforeType.next!;
-
-      // The below doesn't parse modifiers, so we need to do it here.
-      ModifierContext context = new ModifierContext(this);
-      beforeType =
-          start = context.parseVariableDeclarationModifiers(beforeType);
-      varFinalOrConst = context.varFinalOrConst;
-    }
-
     if (allowPatterns &&
         varFinalOrConst != null &&
         (varFinalOrConst.isA(Keyword.VAR) ||
diff --git a/pkg/_fe_analyzer_shared/lib/src/scanner/abstract_scanner.dart b/pkg/_fe_analyzer_shared/lib/src/scanner/abstract_scanner.dart
index 4b3481b..f62ea6b 100644
--- a/pkg/_fe_analyzer_shared/lib/src/scanner/abstract_scanner.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/scanner/abstract_scanner.dart
@@ -73,10 +73,6 @@
   /// based upon the specified language version.
   final LanguageVersionChanged? languageVersionChanged;
 
-  /// Experimental flag for enabling scanning of NNBD tokens
-  /// such as 'required' and 'late'.
-  bool _enableNonNullable = false;
-
   /// Experimental flag for enabling scanning of `>>>`.
   /// See https://github.com/dart-lang/language/issues/61
   /// and https://github.com/dart-lang/language/issues/60
@@ -162,7 +158,6 @@
         allowLazyStrings = true {
     this.tail = this.tokens;
     this.errorTail = this.tokens;
-    this._enableNonNullable = copyFrom._enableNonNullable;
     this._enableTripleShift = copyFrom._enableTripleShift;
     this.tokenStart = copyFrom.tokenStart;
     this.groupingStack = copyFrom.groupingStack;
@@ -171,7 +166,6 @@
   @override
   set configuration(ScannerConfiguration? config) {
     if (config != null) {
-      _enableNonNullable = config.enableNonNullable;
       _enableTripleShift = config.enableTripleShift;
       _forAugmentationLibrary = config.forAugmentationLibrary;
     }
@@ -1048,11 +1042,9 @@
           $EQ, TokenType.QUESTION_QUESTION_EQ, TokenType.QUESTION_QUESTION);
     } else if (next == $PERIOD) {
       next = advance();
-      if (_enableNonNullable) {
-        if ($PERIOD == next) {
-          appendPrecedenceToken(TokenType.QUESTION_PERIOD_PERIOD);
-          return advance();
-        }
+      if ($PERIOD == next) {
+        appendPrecedenceToken(TokenType.QUESTION_PERIOD_PERIOD);
+        return advance();
       }
       appendPrecedenceToken(TokenType.QUESTION_PERIOD);
       return next;
@@ -1572,10 +1564,6 @@
     if (languageVersionChanged != null) {
       // TODO(danrubel): make this required and remove the languageVersion field
       languageVersionChanged!(this, languageVersion);
-    } else {
-      // TODO(danrubel): remove this hack and require listener to update
-      // the scanner's configuration.
-      configuration = ScannerConfiguration.classic;
     }
     if (includeComments) {
       _appendToCommentStream(languageVersion);
@@ -1740,10 +1728,6 @@
     if (keyword == null) {
       return tokenizeIdentifier(next, start, allowDollar);
     }
-    if (!_enableNonNullable &&
-        (keyword == Keyword.LATE || keyword == Keyword.REQUIRED)) {
-      return tokenizeIdentifier(next, start, allowDollar);
-    }
     if (!_forAugmentationLibrary && keyword == Keyword.AUGMENT) {
       return tokenizeIdentifier(next, start, allowDollar);
     }
@@ -2160,13 +2144,7 @@
 /// [ScannerConfiguration] contains information for configuring which tokens
 /// the scanner produces based upon the Dart language level.
 class ScannerConfiguration {
-  static const ScannerConfiguration classic = const ScannerConfiguration();
-  static const ScannerConfiguration nonNullable =
-      const ScannerConfiguration(enableNonNullable: true);
-
-  /// Experimental flag for enabling scanning of NNBD tokens
-  /// such as 'required' and 'late'
-  final bool enableNonNullable;
+  static const ScannerConfiguration nonNullable = const ScannerConfiguration();
 
   /// Experimental flag for enabling scanning of `>>>`.
   /// See https://github.com/dart-lang/language/issues/61
@@ -2177,7 +2155,6 @@
   final bool forAugmentationLibrary;
 
   const ScannerConfiguration({
-    this.enableNonNullable = false,
     this.enableTripleShift = false,
     this.forAugmentationLibrary = false,
   });
diff --git a/pkg/_fe_analyzer_shared/test/macros/code_optimizer_test.dart b/pkg/_fe_analyzer_shared/test/macros/code_optimizer_test.dart
index 0be2a03..60ad5c1 100644
--- a/pkg/_fe_analyzer_shared/test/macros/code_optimizer_test.dart
+++ b/pkg/_fe_analyzer_shared/test/macros/code_optimizer_test.dart
@@ -740,7 +740,6 @@
     code,
     libraryDeclarationNames: libraryDeclarationNames,
     scannerConfiguration: ScannerConfiguration(
-      enableNonNullable: true,
       forAugmentationLibrary: true,
     ),
     throwIfHasErrors: throwIfHasErrors,
diff --git a/pkg/_fe_analyzer_shared/test/scanner_benchmark.dart b/pkg/_fe_analyzer_shared/test/scanner_benchmark.dart
index d2694a8..c6b9abb 100644
--- a/pkg/_fe_analyzer_shared/test/scanner_benchmark.dart
+++ b/pkg/_fe_analyzer_shared/test/scanner_benchmark.dart
@@ -53,7 +53,6 @@
         hasErrors = scanString(
           content,
           configuration: new ScannerConfiguration(
-            enableNonNullable: true,
             enableTripleShift: true,
           ),
           includeComments: true,
@@ -65,7 +64,6 @@
         hasErrors = scan(
           contentBytes,
           configuration: new ScannerConfiguration(
-            enableNonNullable: true,
             enableTripleShift: true,
           ),
           includeComments: true,
@@ -78,7 +76,6 @@
         hasErrors = scan(
           tmp,
           configuration: new ScannerConfiguration(
-            enableNonNullable: true,
             enableTripleShift: true,
           ),
           includeComments: true,
diff --git a/pkg/analyzer/lib/src/dart/scanner/scanner.dart b/pkg/analyzer/lib/src/dart/scanner/scanner.dart
index 99d3b17..4e9757e 100644
--- a/pkg/analyzer/lib/src/dart/scanner/scanner.dart
+++ b/pkg/analyzer/lib/src/dart/scanner/scanner.dart
@@ -200,7 +200,6 @@
           ? fasta.ScannerConfiguration()
           : fasta.ScannerConfiguration(
               enableTripleShift: featureSet.isEnabled(Feature.triple_shift),
-              enableNonNullable: featureSet.isEnabled(Feature.non_nullable),
               forAugmentationLibrary: featureSet.isEnabled(Feature.macros),
             );
 }
diff --git a/pkg/analyzer/test/generated/parser_test_base.dart b/pkg/analyzer/test/generated/parser_test_base.dart
index 17e1f3e..9c16e8e 100644
--- a/pkg/analyzer/test/generated/parser_test_base.dart
+++ b/pkg/analyzer/test/generated/parser_test_base.dart
@@ -257,10 +257,7 @@
     var languageVersion = LibraryLanguageVersion(
         package: ExperimentStatus.currentVersion, override: null);
     var result = scanString(content,
-        configuration: featureSet.isEnabled(Feature.non_nullable)
-            ? ScannerConfiguration.nonNullable
-            : ScannerConfiguration.classic,
-        includeComments: true,
+        configuration: ScannerConfiguration.nonNullable, includeComments: true,
         languageVersionChanged: (scanner, overrideVersion) {
       languageVersion = LibraryLanguageVersion(
         package: ExperimentStatus.currentVersion,
diff --git a/pkg/front_end/lib/src/base/incremental_compiler.dart b/pkg/front_end/lib/src/base/incremental_compiler.dart
index fea1ed6..746be2d 100644
--- a/pkg/front_end/lib/src/base/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/base/incremental_compiler.dart
@@ -1232,7 +1232,6 @@
           return null;
         }
         ScannerConfiguration scannerConfiguration = new ScannerConfiguration(
-            enableNonNullable: true /* can't be disabled */,
             enableTripleShift:
                 /* should this be on the library? */
                 /* this is effectively what the constant evaluator does */
diff --git a/pkg/front_end/lib/src/kernel/macro/macro.dart b/pkg/front_end/lib/src/kernel/macro/macro.dart
index 4cb3207..b6019ee 100644
--- a/pkg/front_end/lib/src/kernel/macro/macro.dart
+++ b/pkg/front_end/lib/src/kernel/macro/macro.dart
@@ -1355,9 +1355,7 @@
 
       ScannerResult scannerResult = scan(sourceUtf8,
           configuration: new ScannerConfiguration(
-              enableNonNullable: true,
-              enableTripleShift: true,
-              forAugmentationLibrary: true));
+              enableTripleShift: true, forAugmentationLibrary: true));
       _sourceLoader.target.addSourceInformation(augmentationImportUri,
           augmentationFileUri, scannerResult.lineStarts, sourceUtf8);
       for (Uri intermediateAugmentationUri in intermediateAugmentationUris) {
diff --git a/pkg/front_end/lib/src/source/source_loader.dart b/pkg/front_end/lib/src/source/source_loader.dart
index d73c8e9..7d2dc9f 100644
--- a/pkg/front_end/lib/src/source/source_loader.dart
+++ b/pkg/front_end/lib/src/source/source_loader.dart
@@ -1051,10 +1051,6 @@
                 ExperimentalFlag.tripleShift,
                 compilationUnit.importUri,
                 compilationUnit.packageLanguageVersion.version),
-            enableNonNullable: target.isExperimentEnabledInLibraryByVersion(
-                ExperimentalFlag.nonNullable,
-                compilationUnit.importUri,
-                compilationUnit.packageLanguageVersion.version),
             forAugmentationLibrary: compilationUnit.forAugmentationLibrary),
         languageVersionChanged:
             (Scanner scanner, LanguageVersionToken version) {
@@ -1066,8 +1062,7 @@
       }
       scanner.configuration = new ScannerConfiguration(
           enableTripleShift:
-              compilationUnit.libraryFeatures.tripleShift.isEnabled,
-          enableNonNullable: true);
+              compilationUnit.libraryFeatures.tripleShift.isEnabled);
     }, allowLazyStrings: allowLazyStrings);
     Token token = result.tokens;
     if (!suppressLexicalErrors) {
diff --git a/pkg/front_end/lib/src/util/import_export_etc_helper.dart b/pkg/front_end/lib/src/util/import_export_etc_helper.dart
index a429c46..07d934f 100644
--- a/pkg/front_end/lib/src/util/import_export_etc_helper.dart
+++ b/pkg/front_end/lib/src/util/import_export_etc_helper.dart
@@ -13,7 +13,6 @@
       new ImportExportPartLibraryHelperVisitor();
   getAST(
     rawBytes,
-    enableNonNullable: true,
     enableTripleShift: true,
     includeBody: false,
     includeComments: false,
diff --git a/pkg/front_end/lib/src/util/outline_extractor.dart b/pkg/front_end/lib/src/util/outline_extractor.dart
index c1cdd78..0a31ca7 100644
--- a/pkg/front_end/lib/src/util/outline_extractor.dart
+++ b/pkg/front_end/lib/src/util/outline_extractor.dart
@@ -134,8 +134,8 @@
         await fileSystem.entityForUri(fileUri).readAsBytes();
     // TODO: Support updating the configuration; also default it to match
     // the package version.
-    final ScannerConfiguration configuration = new ScannerConfiguration(
-        enableNonNullable: true, enableTripleShift: true);
+    final ScannerConfiguration configuration =
+        new ScannerConfiguration(enableTripleShift: true);
     textualOutlineStopwatch.start();
     final String? outlined =
         textualOutline(bytes, configuration, enablePatterns: true);
@@ -145,7 +145,6 @@
     getAstStopwatch.start();
     List<Token> languageVersionsSeen = [];
     final ParserAstNode ast = getAST(bytes2,
-        enableNonNullable: configuration.enableNonNullable,
         enableTripleShift: configuration.enableTripleShift,
         languageVersionsSeen: languageVersionsSeen);
     getAstStopwatch.stop();
diff --git a/pkg/front_end/lib/src/util/parser_ast.dart b/pkg/front_end/lib/src/util/parser_ast.dart
index 77aeeee..be798f3 100644
--- a/pkg/front_end/lib/src/util/parser_ast.dart
+++ b/pkg/front_end/lib/src/util/parser_ast.dart
@@ -28,15 +28,13 @@
   Uint8List rawBytes, {
   bool includeBody = true,
   bool includeComments = false,
-  bool enableNonNullable = false,
   bool enableTripleShift = false,
   bool allowPatterns = false,
   List<Token>? languageVersionsSeen,
   List<int>? lineStarts,
 }) {
-  ScannerConfiguration scannerConfiguration = new ScannerConfiguration(
-      enableNonNullable: enableNonNullable,
-      enableTripleShift: enableTripleShift);
+  ScannerConfiguration scannerConfiguration =
+      new ScannerConfiguration(enableTripleShift: enableTripleShift);
 
   Utf8BytesScanner scanner = new Utf8BytesScanner(
     rawBytes,
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_39326.dart b/pkg/front_end/parser_testcases/also-nnbd/issue_39326.dart
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_39326.dart
rename to pkg/front_end/parser_testcases/also-nnbd/issue_39326.dart
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_39326.dart.expect b/pkg/front_end/parser_testcases/also-nnbd/issue_39326.dart.expect
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_39326.dart.expect
rename to pkg/front_end/parser_testcases/also-nnbd/issue_39326.dart.expect
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_39326.dart.intertwined.expect b/pkg/front_end/parser_testcases/also-nnbd/issue_39326.dart.intertwined.expect
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_39326.dart.intertwined.expect
rename to pkg/front_end/parser_testcases/also-nnbd/issue_39326.dart.intertwined.expect
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_39326.dart.parser.expect b/pkg/front_end/parser_testcases/also-nnbd/issue_39326.dart.parser.expect
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_39326.dart.parser.expect
rename to pkg/front_end/parser_testcases/also-nnbd/issue_39326.dart.parser.expect
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_39326.dart.scanner.expect b/pkg/front_end/parser_testcases/also-nnbd/issue_39326.dart.scanner.expect
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_39326.dart.scanner.expect
rename to pkg/front_end/parser_testcases/also-nnbd/issue_39326.dart.scanner.expect
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional.dart b/pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional.dart
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional.dart
rename to pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional.dart
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional.dart.expect b/pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional.dart.expect
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional.dart.expect
rename to pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional.dart.expect
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional.dart.intertwined.expect b/pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional.dart.intertwined.expect
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional.dart.intertwined.expect
rename to pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional.dart.intertwined.expect
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional.dart.parser.expect b/pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional.dart.parser.expect
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional.dart.parser.expect
rename to pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional.dart.parser.expect
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional.dart.scanner.expect b/pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional.dart.scanner.expect
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional.dart.scanner.expect
rename to pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional.dart.scanner.expect
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional_2.dart b/pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_2.dart
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional_2.dart
rename to pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_2.dart
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional_2.dart.expect b/pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_2.dart.expect
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional_2.dart.expect
rename to pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_2.dart.expect
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional_2.dart.intertwined.expect b/pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_2.dart.intertwined.expect
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional_2.dart.intertwined.expect
rename to pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_2.dart.intertwined.expect
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional_2.dart.parser.expect b/pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_2.dart.parser.expect
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional_2.dart.parser.expect
rename to pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_2.dart.parser.expect
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional_2.dart.scanner.expect b/pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_2.dart.scanner.expect
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional_2.dart.scanner.expect
rename to pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_2.dart.scanner.expect
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional_3.dart b/pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_3.dart
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional_3.dart
rename to pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_3.dart
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional_3.dart.expect b/pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_3.dart.expect
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional_3.dart.expect
rename to pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_3.dart.expect
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional_3.dart.intertwined.expect b/pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_3.dart.intertwined.expect
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional_3.dart.intertwined.expect
rename to pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_3.dart.intertwined.expect
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional_3.dart.parser.expect b/pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_3.dart.parser.expect
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional_3.dart.parser.expect
rename to pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_3.dart.parser.expect
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional_3.dart.scanner.expect b/pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_3.dart.scanner.expect
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional_3.dart.scanner.expect
rename to pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_3.dart.scanner.expect
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional_4.dart b/pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_4.dart
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional_4.dart
rename to pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_4.dart
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional_4.dart.expect b/pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_4.dart.expect
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional_4.dart.expect
rename to pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_4.dart.expect
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional_4.dart.intertwined.expect b/pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_4.dart.intertwined.expect
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional_4.dart.intertwined.expect
rename to pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_4.dart.intertwined.expect
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional_4.dart.parser.expect b/pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_4.dart.parser.expect
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional_4.dart.parser.expect
rename to pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_4.dart.parser.expect
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional_4.dart.scanner.expect b/pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_4.dart.scanner.expect
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_40267_conditional_4.dart.scanner.expect
rename to pkg/front_end/parser_testcases/also-nnbd/issue_40267_conditional_4.dart.scanner.expect
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart b/pkg/front_end/parser_testcases/also-nnbd/issue_40288.dart
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart
rename to pkg/front_end/parser_testcases/also-nnbd/issue_40288.dart
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.expect b/pkg/front_end/parser_testcases/also-nnbd/issue_40288.dart.expect
similarity index 76%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.expect
rename to pkg/front_end/parser_testcases/also-nnbd/issue_40288.dart.expect
index 6ac7949..a846e0d 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.expect
+++ b/pkg/front_end/parser_testcases/also-nnbd/issue_40288.dart.expect
@@ -1,7 +1,30 @@
+Problems reported:
+
+parser/also-nnbd/issue_40288:1:7: Can't use 'late' as a name here.
+class late {
+      ^^^^
+
+parser/also-nnbd/issue_40288:5:7: Can't use 'required' as a name here.
+class required {
+      ^^^^^^^^
+
+parser/also-nnbd/issue_40288:10:8: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+  late l = late();
+       ^
+
+parser/also-nnbd/issue_40288:11:3: Can't have modifier 'required' here.
+  required r = required();
+  ^^^^^^^^
+
+parser/also-nnbd/issue_40288:11:12: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+  required r = required();
+           ^
+
 beginCompilationUnit(class)
   beginMetadataStar(class)
   endMetadataStar(0)
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'late' as a name here., null, {lexeme: late}], late, late)
     handleIdentifier(late, classOrMixinDeclaration)
     handleNoTypeVariables({)
     beginClassDeclaration(class, null, null, null, null, null, null, null, null, late)
@@ -33,6 +56,7 @@
   beginMetadataStar(class)
   endMetadataStar(0)
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'required' as a name here., null, {lexeme: required}], required, required)
     handleIdentifier(required, classOrMixinDeclaration)
     handleNoTypeVariables({)
     beginClassDeclaration(class, null, null, null, null, null, null, null, null, required)
@@ -76,10 +100,9 @@
         beginMetadataStar(late)
         endMetadataStar(0)
         beginMember()
-          beginFields(DeclarationKind.Class, null, null, null, null, null, null, null, {)
-            handleIdentifier(late, typeReference)
-            handleNoTypeArguments(l)
-            handleType(late, null)
+          beginFields(DeclarationKind.Class, null, null, null, null, null, late, null, {)
+            handleRecoverableError(MissingConstFinalVarOrType, l, l)
+            handleNoType(late)
             handleIdentifier(l, fieldDeclaration)
             beginFieldInitializer(=)
               handleIdentifier(late, expression)
@@ -88,15 +111,15 @@
               endArguments(0, (, ))
               handleSend(late, ))
             endFieldInitializer(=, ))
-          endClassFields(null, null, null, null, null, null, null, 1, late, ;)
+          endClassFields(null, null, null, null, null, late, null, 1, late, ;)
         endMember()
         beginMetadataStar(required)
         endMetadataStar(0)
+        handleRecoverableError(Message[ExtraneousModifier, Can't have modifier 'required' here., Try removing 'required'., {lexeme: required}], required, required)
         beginMember()
           beginFields(DeclarationKind.Class, null, null, null, null, null, null, null, ;)
-            handleIdentifier(required, typeReference)
-            handleNoTypeArguments(r)
-            handleType(required, null)
+            handleRecoverableError(MissingConstFinalVarOrType, r, r)
+            handleNoType(required)
             handleIdentifier(r, fieldDeclaration)
             beginFieldInitializer(=)
               handleIdentifier(required, expression)
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.intertwined.expect b/pkg/front_end/parser_testcases/also-nnbd/issue_40288.dart.intertwined.expect
similarity index 88%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.intertwined.expect
rename to pkg/front_end/parser_testcases/also-nnbd/issue_40288.dart.intertwined.expect
index 8a65b25..448eb52 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/also-nnbd/issue_40288.dart.intertwined.expect
@@ -10,6 +10,8 @@
       parseClassOrNamedMixinApplication(class, null, null, null, null, null, null, null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(late, Template(BuiltInIdentifierInDeclaration))
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'late' as a name here., null, {lexeme: late}], late, late)
           listener: handleIdentifier(late, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
         listener: beginClassDeclaration(class, null, null, null, null, null, null, null, null, late)
@@ -74,6 +76,8 @@
       parseClassOrNamedMixinApplication(class, null, null, null, null, null, null, null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(required, Template(BuiltInIdentifierInDeclaration))
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'required' as a name here., null, {lexeme: required}], required, required)
           listener: handleIdentifier(required, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
         listener: beginClassDeclaration(class, null, null, null, null, null, null, null, null, required)
@@ -159,24 +163,27 @@
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFields({, null, null, null, null, null, null, null, {, SimpleType(), l, DeclarationKind.Class, C, false)
-                listener: beginFields(DeclarationKind.Class, null, null, null, null, null, null, null, {)
-                listener: handleIdentifier(late, typeReference)
-                listener: handleNoTypeArguments(l)
-                listener: handleType(late, null)
+              isReservedKeyword(=)
+              parseFields({, null, null, null, null, null, late, null, late, NoType(), l, DeclarationKind.Class, C, false)
+                listener: beginFields(DeclarationKind.Class, null, null, null, null, null, late, null, {)
+                reportRecoverableError(l, MissingConstFinalVarOrType)
+                  listener: handleRecoverableError(MissingConstFinalVarOrType, l, l)
+                listener: handleNoType(late)
                 ensureIdentifierPotentiallyRecovered(late, fieldDeclaration, false)
                   listener: handleIdentifier(l, fieldDeclaration)
-                parseFieldInitializerOpt(l, l, null, null, null, null, null, DeclarationKind.Class, C)
+                parseFieldInitializerOpt(l, l, late, null, null, null, null, DeclarationKind.Class, C)
                   listener: beginFieldInitializer(=)
                   parseExpression(=)
                     parsePrecedenceExpression(=, 1, true, ConstantPatternContext.none)
                       parseUnaryExpression(=, true, ConstantPatternContext.none)
                         parsePrimary(=, expression, ConstantPatternContext.none)
+                          inPlainSync()
                           parseSendOrFunctionLiteral(=, expression, ConstantPatternContext.none)
                             looksLikeFunctionBody(;)
                             parseSend(=, expression, ConstantPatternContext.none)
                               isNextIdentifier(=)
                               ensureIdentifier(=, expression)
+                                inPlainSync()
                                 listener: handleIdentifier(late, expression)
                               listener: handleNoTypeArguments(()
                               parseArgumentsOpt(late)
@@ -186,19 +193,22 @@
                                     listener: endArguments(0, (, ))
                               listener: handleSend(late, ))
                   listener: endFieldInitializer(=, ))
-                listener: endClassFields(null, null, null, null, null, null, null, 1, late, ;)
+                listener: endClassFields(null, null, null, null, null, late, null, 1, late, ;)
               listener: endMember()
             notEofOrValue(}, required)
             parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(required)
                 listener: endMetadataStar(0)
+              reportRecoverableErrorWithToken(required, Template(ExtraneousModifier))
+                listener: handleRecoverableError(Message[ExtraneousModifier, Can't have modifier 'required' here., Try removing 'required'., {lexeme: required}], required, required)
               listener: beginMember()
-              parseFields(;, null, null, null, null, null, null, null, ;, SimpleType(), r, DeclarationKind.Class, C, false)
+              isReservedKeyword(=)
+              parseFields(;, null, null, null, null, null, null, null, required, NoType(), r, DeclarationKind.Class, C, false)
                 listener: beginFields(DeclarationKind.Class, null, null, null, null, null, null, null, ;)
-                listener: handleIdentifier(required, typeReference)
-                listener: handleNoTypeArguments(r)
-                listener: handleType(required, null)
+                reportRecoverableError(r, MissingConstFinalVarOrType)
+                  listener: handleRecoverableError(MissingConstFinalVarOrType, r, r)
+                listener: handleNoType(required)
                 ensureIdentifierPotentiallyRecovered(required, fieldDeclaration, false)
                   listener: handleIdentifier(r, fieldDeclaration)
                 parseFieldInitializerOpt(r, r, null, null, null, null, null, DeclarationKind.Class, C)
@@ -207,11 +217,13 @@
                     parsePrecedenceExpression(=, 1, true, ConstantPatternContext.none)
                       parseUnaryExpression(=, true, ConstantPatternContext.none)
                         parsePrimary(=, expression, ConstantPatternContext.none)
+                          inPlainSync()
                           parseSendOrFunctionLiteral(=, expression, ConstantPatternContext.none)
                             looksLikeFunctionBody(;)
                             parseSend(=, expression, ConstantPatternContext.none)
                               isNextIdentifier(=)
                               ensureIdentifier(=, expression)
+                                inPlainSync()
                                 listener: handleIdentifier(required, expression)
                               listener: handleNoTypeArguments(()
                               parseArgumentsOpt(required)
diff --git a/pkg/front_end/parser_testcases/also-nnbd/issue_40288.dart.parser.expect b/pkg/front_end/parser_testcases/also-nnbd/issue_40288.dart.parser.expect
new file mode 100644
index 0000000..c661340
--- /dev/null
+++ b/pkg/front_end/parser_testcases/also-nnbd/issue_40288.dart.parser.expect
@@ -0,0 +1,27 @@
+class late {
+int get g => 1;
+}
+
+class required {
+int get g => 2;
+}
+
+class C {
+late l = late();
+required r = required();
+}
+
+
+class[KeywordToken] late[KeywordToken] {[BeginToken]
+int[StringToken] get[KeywordToken] g[StringToken] =>[SimpleToken] 1[StringToken];[SimpleToken]
+}[SimpleToken]
+
+class[KeywordToken] required[KeywordToken] {[BeginToken]
+int[StringToken] get[KeywordToken] g[StringToken] =>[SimpleToken] 2[StringToken];[SimpleToken]
+}[SimpleToken]
+
+class[KeywordToken] C[StringToken] {[BeginToken]
+late[KeywordToken] l[StringToken] =[SimpleToken] late[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+required[KeywordToken] r[StringToken] =[SimpleToken] required[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/also-nnbd/issue_40288.dart.scanner.expect b/pkg/front_end/parser_testcases/also-nnbd/issue_40288.dart.scanner.expect
new file mode 100644
index 0000000..c661340
--- /dev/null
+++ b/pkg/front_end/parser_testcases/also-nnbd/issue_40288.dart.scanner.expect
@@ -0,0 +1,27 @@
+class late {
+int get g => 1;
+}
+
+class required {
+int get g => 2;
+}
+
+class C {
+late l = late();
+required r = required();
+}
+
+
+class[KeywordToken] late[KeywordToken] {[BeginToken]
+int[StringToken] get[KeywordToken] g[StringToken] =>[SimpleToken] 1[StringToken];[SimpleToken]
+}[SimpleToken]
+
+class[KeywordToken] required[KeywordToken] {[BeginToken]
+int[StringToken] get[KeywordToken] g[StringToken] =>[SimpleToken] 2[StringToken];[SimpleToken]
+}[SimpleToken]
+
+class[KeywordToken] C[StringToken] {[BeginToken]
+late[KeywordToken] l[StringToken] =[SimpleToken] late[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+required[KeywordToken] r[StringToken] =[SimpleToken] required[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart b/pkg/front_end/parser_testcases/also-nnbd/issue_40288_prime.dart
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart
rename to pkg/front_end/parser_testcases/also-nnbd/issue_40288_prime.dart
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.expect b/pkg/front_end/parser_testcases/also-nnbd/issue_40288_prime.dart.expect
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.expect
rename to pkg/front_end/parser_testcases/also-nnbd/issue_40288_prime.dart.expect
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/also-nnbd/issue_40288_prime.dart.intertwined.expect
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.intertwined.expect
rename to pkg/front_end/parser_testcases/also-nnbd/issue_40288_prime.dart.intertwined.expect
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.parser.expect b/pkg/front_end/parser_testcases/also-nnbd/issue_40288_prime.dart.parser.expect
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.parser.expect
rename to pkg/front_end/parser_testcases/also-nnbd/issue_40288_prime.dart.parser.expect
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.scanner.expect b/pkg/front_end/parser_testcases/also-nnbd/issue_40288_prime.dart.scanner.expect
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.scanner.expect
rename to pkg/front_end/parser_testcases/also-nnbd/issue_40288_prime.dart.scanner.expect
diff --git a/pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart b/pkg/front_end/parser_testcases/also-nnbd/nullable_type_argument.dart
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart
rename to pkg/front_end/parser_testcases/also-nnbd/nullable_type_argument.dart
diff --git a/pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.expect b/pkg/front_end/parser_testcases/also-nnbd/nullable_type_argument.dart.expect
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.expect
rename to pkg/front_end/parser_testcases/also-nnbd/nullable_type_argument.dart.expect
diff --git a/pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.intertwined.expect b/pkg/front_end/parser_testcases/also-nnbd/nullable_type_argument.dart.intertwined.expect
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.intertwined.expect
rename to pkg/front_end/parser_testcases/also-nnbd/nullable_type_argument.dart.intertwined.expect
diff --git a/pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.parser.expect b/pkg/front_end/parser_testcases/also-nnbd/nullable_type_argument.dart.parser.expect
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.parser.expect
rename to pkg/front_end/parser_testcases/also-nnbd/nullable_type_argument.dart.parser.expect
diff --git a/pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.scanner.expect b/pkg/front_end/parser_testcases/also-nnbd/nullable_type_argument.dart.scanner.expect
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.scanner.expect
rename to pkg/front_end/parser_testcases/also-nnbd/nullable_type_argument.dart.scanner.expect
diff --git a/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart b/pkg/front_end/parser_testcases/also-nnbd/use_late_in_non_nnbd.dart
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart
rename to pkg/front_end/parser_testcases/also-nnbd/use_late_in_non_nnbd.dart
diff --git a/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.expect b/pkg/front_end/parser_testcases/also-nnbd/use_late_in_non_nnbd.dart.expect
similarity index 71%
rename from pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.expect
rename to pkg/front_end/parser_testcases/also-nnbd/use_late_in_non_nnbd.dart.expect
index cb7e1c8..f40774e 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.expect
+++ b/pkg/front_end/parser_testcases/also-nnbd/use_late_in_non_nnbd.dart.expect
@@ -1,62 +1,38 @@
 Problems reported:
 
-parser/non-nnbd/use_late_in_non_nnbd:4:1: The modifier 'late' is only available in null safe libraries.
-late int x2;
-^^^^
+parser/also-nnbd/use_late_in_non_nnbd:7:6: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+late x5;
+     ^^
 
-parser/non-nnbd/use_late_in_non_nnbd:5:1: The modifier 'late' is only available in null safe libraries.
-late List<int> x3;
-^^^^
-
-parser/non-nnbd/use_late_in_non_nnbd:6:1: The modifier 'late' is only available in null safe libraries.
-late final int x4;
-^^^^
-
-parser/non-nnbd/use_late_in_non_nnbd:8:1: Unexpected token ';'.
+parser/also-nnbd/use_late_in_non_nnbd:8:1: Unexpected token ';'.
 ; // Meant to confuse so `.next`-ing makes it look like the end of a field.
 ^
 
-parser/non-nnbd/use_late_in_non_nnbd:9:1: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+parser/also-nnbd/use_late_in_non_nnbd:9:1: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
 late;
 ^^^^
 
-parser/non-nnbd/use_late_in_non_nnbd:10:1: Unexpected token ';'.
+parser/also-nnbd/use_late_in_non_nnbd:10:1: Unexpected token ';'.
 ; // Meant to confuse so `.next`-ing makes it look like the end of a field.
 ^
 
-parser/non-nnbd/use_late_in_non_nnbd:14:3: The modifier 'late' is only available in null safe libraries.
-  late int y2;
-  ^^^^
+parser/also-nnbd/use_late_in_non_nnbd:17:8: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+  late y5;
+       ^^
 
-parser/non-nnbd/use_late_in_non_nnbd:15:3: The modifier 'late' is only available in null safe libraries.
-  late List<int> y3;
-  ^^^^
+parser/also-nnbd/use_late_in_non_nnbd:28:8: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+  late z5;
+       ^^
 
-parser/non-nnbd/use_late_in_non_nnbd:16:3: The modifier 'late' is only available in null safe libraries.
-  late final int y4;
-  ^^^^
-
-parser/non-nnbd/use_late_in_non_nnbd:25:3: The modifier 'late' is only available in null safe libraries.
-  late int z2;
-  ^^^^
-
-parser/non-nnbd/use_late_in_non_nnbd:26:3: The modifier 'late' is only available in null safe libraries.
-  late List<int> x3;
-  ^^^^
-
-parser/non-nnbd/use_late_in_non_nnbd:27:3: The modifier 'late' is only available in null safe libraries.
-  late final int z4;
-  ^^^^
-
-parser/non-nnbd/use_late_in_non_nnbd:29:3: Expected a class member, but got ';'.
+parser/also-nnbd/use_late_in_non_nnbd:29:3: Expected a class member, but got ';'.
   ; // Meant to confuse so `.next`-ing makes it look like the end of a field.
   ^
 
-parser/non-nnbd/use_late_in_non_nnbd:30:3: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+parser/also-nnbd/use_late_in_non_nnbd:30:3: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
   late;
   ^^^^
 
-parser/non-nnbd/use_late_in_non_nnbd:31:3: Expected a class member, but got ';'.
+parser/also-nnbd/use_late_in_non_nnbd:31:3: Expected a class member, but got ';'.
   ; // Meant to confuse so `.next`-ing makes it look like the end of a field.
   ^
 
@@ -75,20 +51,18 @@
   beginMetadataStar(late)
   endMetadataStar(0)
   beginTopLevelMember(late)
-    handleRecoverableError(Message[UnexpectedModifierInNonNnbd, The modifier 'late' is only available in null safe libraries., null, {lexeme: late}], late, late)
-    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, late, null, late)
+    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, late, null, ;)
       handleIdentifier(int, typeReference)
       handleNoTypeArguments(x2)
       handleType(int, null)
       handleIdentifier(x2, topLevelVariableDeclaration)
       handleNoFieldInitializer(;)
-    endTopLevelFields(null, null, null, null, late, null, 1, int, ;)
+    endTopLevelFields(null, null, null, null, late, null, 1, late, ;)
   endTopLevelDeclaration(;)
   beginMetadataStar(late)
   endMetadataStar(0)
   beginTopLevelMember(late)
-    handleRecoverableError(Message[UnexpectedModifierInNonNnbd, The modifier 'late' is only available in null safe libraries., null, {lexeme: late}], late, late)
-    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, late, null, late)
+    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, late, null, ;)
       handleIdentifier(List, typeReference)
       beginTypeArguments(<)
         handleIdentifier(int, typeReference)
@@ -98,30 +72,28 @@
       handleType(List, null)
       handleIdentifier(x3, topLevelVariableDeclaration)
       handleNoFieldInitializer(;)
-    endTopLevelFields(null, null, null, null, late, null, 1, List, ;)
+    endTopLevelFields(null, null, null, null, late, null, 1, late, ;)
   endTopLevelDeclaration(;)
   beginMetadataStar(late)
   endMetadataStar(0)
   beginTopLevelMember(late)
-    handleRecoverableError(Message[UnexpectedModifierInNonNnbd, The modifier 'late' is only available in null safe libraries., null, {lexeme: late}], late, late)
-    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, late, final, late)
+    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, late, final, ;)
       handleIdentifier(int, typeReference)
       handleNoTypeArguments(x4)
       handleType(int, null)
       handleIdentifier(x4, topLevelVariableDeclaration)
       handleNoFieldInitializer(;)
-    endTopLevelFields(null, null, null, null, late, final, 1, final, ;)
+    endTopLevelFields(null, null, null, null, late, final, 1, late, ;)
   endTopLevelDeclaration(;)
   beginMetadataStar(late)
   endMetadataStar(0)
   beginTopLevelMember(late)
-    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, null, null, ;)
-      handleIdentifier(late, typeReference)
-      handleNoTypeArguments(x5)
-      handleType(late, null)
+    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, late, null, ;)
+      handleRecoverableError(MissingConstFinalVarOrType, x5, x5)
+      handleNoType(late)
       handleIdentifier(x5, topLevelVariableDeclaration)
       handleNoFieldInitializer(;)
-    endTopLevelFields(null, null, null, null, null, null, 1, late, ;)
+    endTopLevelFields(null, null, null, null, late, null, 1, late, ;)
   endTopLevelDeclaration(;)
   beginMetadataStar(;)
   endMetadataStar(0)
@@ -180,8 +152,7 @@
             handleNoVariableInitializer(y1)
           endInitializedIdentifier(y1)
         endVariablesDeclaration(1, ;)
-        handleRecoverableError(Message[UnexpectedModifierInNonNnbd, The modifier 'late' is only available in null safe libraries., null, {lexeme: late}], late, late)
-        beginMetadataStar(int)
+        beginMetadataStar(late)
         endMetadataStar(0)
         handleIdentifier(int, typeReference)
         handleNoTypeArguments(y2)
@@ -192,8 +163,7 @@
             handleNoVariableInitializer(y2)
           endInitializedIdentifier(y2)
         endVariablesDeclaration(1, ;)
-        handleRecoverableError(Message[UnexpectedModifierInNonNnbd, The modifier 'late' is only available in null safe libraries., null, {lexeme: late}], late, late)
-        beginMetadataStar(List)
+        beginMetadataStar(late)
         endMetadataStar(0)
         handleIdentifier(List, typeReference)
         beginTypeArguments(<)
@@ -208,8 +178,7 @@
             handleNoVariableInitializer(y3)
           endInitializedIdentifier(y3)
         endVariablesDeclaration(1, ;)
-        handleRecoverableError(Message[UnexpectedModifierInNonNnbd, The modifier 'late' is only available in null safe libraries., null, {lexeme: late}], late, late)
-        beginMetadataStar(int)
+        beginMetadataStar(late)
         endMetadataStar(0)
         handleIdentifier(int, typeReference)
         handleNoTypeArguments(y4)
@@ -220,12 +189,11 @@
             handleNoVariableInitializer(y4)
           endInitializedIdentifier(y4)
         endVariablesDeclaration(1, ;)
+        handleRecoverableError(MissingConstFinalVarOrType, y5, y5)
         beginMetadataStar(late)
         endMetadataStar(0)
-        handleIdentifier(late, typeReference)
-        handleNoTypeArguments(y5)
-        handleType(late, null)
-        beginVariablesDeclaration(y5, null, null)
+        handleNoType(late)
+        beginVariablesDeclaration(y5, late, null)
           handleIdentifier(y5, localVariableDeclaration)
           beginInitializedIdentifier(y5)
             handleNoVariableInitializer(y5)
@@ -266,21 +234,19 @@
         endMember()
         beginMetadataStar(late)
         endMetadataStar(0)
-        handleRecoverableError(Message[UnexpectedModifierInNonNnbd, The modifier 'late' is only available in null safe libraries., null, {lexeme: late}], late, late)
         beginMember()
-          beginFields(DeclarationKind.Class, null, null, null, null, null, late, null, late)
+          beginFields(DeclarationKind.Class, null, null, null, null, null, late, null, ;)
             handleIdentifier(int, typeReference)
             handleNoTypeArguments(z2)
             handleType(int, null)
             handleIdentifier(z2, fieldDeclaration)
             handleNoFieldInitializer(;)
-          endClassFields(null, null, null, null, null, late, null, 1, int, ;)
+          endClassFields(null, null, null, null, null, late, null, 1, late, ;)
         endMember()
         beginMetadataStar(late)
         endMetadataStar(0)
-        handleRecoverableError(Message[UnexpectedModifierInNonNnbd, The modifier 'late' is only available in null safe libraries., null, {lexeme: late}], late, late)
         beginMember()
-          beginFields(DeclarationKind.Class, null, null, null, null, null, late, null, late)
+          beginFields(DeclarationKind.Class, null, null, null, null, null, late, null, ;)
             handleIdentifier(List, typeReference)
             beginTypeArguments(<)
               handleIdentifier(int, typeReference)
@@ -290,30 +256,28 @@
             handleType(List, null)
             handleIdentifier(x3, fieldDeclaration)
             handleNoFieldInitializer(;)
-          endClassFields(null, null, null, null, null, late, null, 1, List, ;)
+          endClassFields(null, null, null, null, null, late, null, 1, late, ;)
         endMember()
         beginMetadataStar(late)
         endMetadataStar(0)
-        handleRecoverableError(Message[UnexpectedModifierInNonNnbd, The modifier 'late' is only available in null safe libraries., null, {lexeme: late}], late, late)
         beginMember()
-          beginFields(DeclarationKind.Class, null, null, null, null, null, late, final, late)
+          beginFields(DeclarationKind.Class, null, null, null, null, null, late, final, ;)
             handleIdentifier(int, typeReference)
             handleNoTypeArguments(z4)
             handleType(int, null)
             handleIdentifier(z4, fieldDeclaration)
             handleNoFieldInitializer(;)
-          endClassFields(null, null, null, null, null, late, final, 1, final, ;)
+          endClassFields(null, null, null, null, null, late, final, 1, late, ;)
         endMember()
         beginMetadataStar(late)
         endMetadataStar(0)
         beginMember()
-          beginFields(DeclarationKind.Class, null, null, null, null, null, null, null, ;)
-            handleIdentifier(late, typeReference)
-            handleNoTypeArguments(z5)
-            handleType(late, null)
+          beginFields(DeclarationKind.Class, null, null, null, null, null, late, null, ;)
+            handleRecoverableError(MissingConstFinalVarOrType, z5, z5)
+            handleNoType(late)
             handleIdentifier(z5, fieldDeclaration)
             handleNoFieldInitializer(;)
-          endClassFields(null, null, null, null, null, null, null, 1, late, ;)
+          endClassFields(null, null, null, null, null, late, null, 1, late, ;)
         endMember()
         beginMetadataStar(;)
         endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.intertwined.expect b/pkg/front_end/parser_testcases/also-nnbd/use_late_in_non_nnbd.dart.intertwined.expect
similarity index 66%
rename from pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.intertwined.expect
rename to pkg/front_end/parser_testcases/also-nnbd/use_late_in_non_nnbd.dart.intertwined.expect
index b42daac..836bda4 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/also-nnbd/use_late_in_non_nnbd.dart.intertwined.expect
@@ -25,11 +25,8 @@
       listener: endMetadataStar(0)
     parseTopLevelMemberImpl(;)
       listener: beginTopLevelMember(late)
-      indicatesMethodOrField(;)
-      reportRecoverableErrorWithToken(late, Template(UnexpectedModifierInNonNnbd))
-        listener: handleRecoverableError(Message[UnexpectedModifierInNonNnbd, The modifier 'late' is only available in null safe libraries., null, {lexeme: late}], late, late)
-      parseFields(late, null, null, null, null, null, late, null, late, SimpleType(), x2, DeclarationKind.TopLevel, null, false)
-        listener: beginFields(DeclarationKind.TopLevel, null, null, null, null, null, late, null, late)
+      parseFields(;, null, null, null, null, null, late, null, late, SimpleType(), x2, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(DeclarationKind.TopLevel, null, null, null, null, null, late, null, ;)
         listener: handleIdentifier(int, typeReference)
         listener: handleNoTypeArguments(x2)
         listener: handleType(int, null)
@@ -37,7 +34,7 @@
           listener: handleIdentifier(x2, topLevelVariableDeclaration)
         parseFieldInitializerOpt(x2, x2, late, null, null, null, null, DeclarationKind.TopLevel, null)
           listener: handleNoFieldInitializer(;)
-        listener: endTopLevelFields(null, null, null, null, late, null, 1, int, ;)
+        listener: endTopLevelFields(null, null, null, null, late, null, 1, late, ;)
   listener: endTopLevelDeclaration(;)
   parseTopLevelDeclarationImpl(;, DirectiveContext(DirectiveState.Declarations))
     parseMetadataStar(;)
@@ -45,11 +42,8 @@
       listener: endMetadataStar(0)
     parseTopLevelMemberImpl(;)
       listener: beginTopLevelMember(late)
-      indicatesMethodOrField(;)
-      reportRecoverableErrorWithToken(late, Template(UnexpectedModifierInNonNnbd))
-        listener: handleRecoverableError(Message[UnexpectedModifierInNonNnbd, The modifier 'late' is only available in null safe libraries., null, {lexeme: late}], late, late)
-      parseFields(late, null, null, null, null, null, late, null, late, SimpleTypeWith1Argument(typeArg: SimpleTypeArgument1()), x3, DeclarationKind.TopLevel, null, false)
-        listener: beginFields(DeclarationKind.TopLevel, null, null, null, null, null, late, null, late)
+      parseFields(;, null, null, null, null, null, late, null, late, SimpleTypeWith1Argument(typeArg: SimpleTypeArgument1()), x3, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(DeclarationKind.TopLevel, null, null, null, null, null, late, null, ;)
         listener: handleIdentifier(List, typeReference)
         listener: beginTypeArguments(<)
         listener: handleIdentifier(int, typeReference)
@@ -61,7 +55,7 @@
           listener: handleIdentifier(x3, topLevelVariableDeclaration)
         parseFieldInitializerOpt(x3, x3, late, null, null, null, null, DeclarationKind.TopLevel, null)
           listener: handleNoFieldInitializer(;)
-        listener: endTopLevelFields(null, null, null, null, late, null, 1, List, ;)
+        listener: endTopLevelFields(null, null, null, null, late, null, 1, late, ;)
   listener: endTopLevelDeclaration(;)
   parseTopLevelDeclarationImpl(;, DirectiveContext(DirectiveState.Declarations))
     parseMetadataStar(;)
@@ -69,13 +63,10 @@
       listener: endMetadataStar(0)
     parseTopLevelMemberImpl(;)
       listener: beginTopLevelMember(late)
-      indicatesMethodOrField(;)
-      reportRecoverableErrorWithToken(late, Template(UnexpectedModifierInNonNnbd))
-        listener: handleRecoverableError(Message[UnexpectedModifierInNonNnbd, The modifier 'late' is only available in null safe libraries., null, {lexeme: late}], late, late)
       skipOuterPattern(final)
         skipObjectPatternRest(int)
-      parseFields(late, null, null, null, null, null, late, final, final, SimpleType(), x4, DeclarationKind.TopLevel, null, false)
-        listener: beginFields(DeclarationKind.TopLevel, null, null, null, null, null, late, final, late)
+      parseFields(;, null, null, null, null, null, late, final, final, SimpleType(), x4, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(DeclarationKind.TopLevel, null, null, null, null, null, late, final, ;)
         listener: handleIdentifier(int, typeReference)
         listener: handleNoTypeArguments(x4)
         listener: handleType(int, null)
@@ -83,7 +74,7 @@
           listener: handleIdentifier(x4, topLevelVariableDeclaration)
         parseFieldInitializerOpt(x4, x4, late, null, null, null, final, DeclarationKind.TopLevel, null)
           listener: handleNoFieldInitializer(;)
-        listener: endTopLevelFields(null, null, null, null, late, final, 1, final, ;)
+        listener: endTopLevelFields(null, null, null, null, late, final, 1, late, ;)
   listener: endTopLevelDeclaration(;)
   parseTopLevelDeclarationImpl(;, DirectiveContext(DirectiveState.Declarations))
     parseMetadataStar(;)
@@ -91,16 +82,17 @@
       listener: endMetadataStar(0)
     parseTopLevelMemberImpl(;)
       listener: beginTopLevelMember(late)
-      parseFields(;, null, null, null, null, null, null, null, ;, SimpleType(), x5, DeclarationKind.TopLevel, null, false)
-        listener: beginFields(DeclarationKind.TopLevel, null, null, null, null, null, null, null, ;)
-        listener: handleIdentifier(late, typeReference)
-        listener: handleNoTypeArguments(x5)
-        listener: handleType(late, null)
+      isReservedKeyword(;)
+      parseFields(;, null, null, null, null, null, late, null, late, NoType(), x5, DeclarationKind.TopLevel, null, false)
+        listener: beginFields(DeclarationKind.TopLevel, null, null, null, null, null, late, null, ;)
+        reportRecoverableError(x5, MissingConstFinalVarOrType)
+          listener: handleRecoverableError(MissingConstFinalVarOrType, x5, x5)
+        listener: handleNoType(late)
         ensureIdentifierPotentiallyRecovered(late, topLevelVariableDeclaration, false)
           listener: handleIdentifier(x5, topLevelVariableDeclaration)
-        parseFieldInitializerOpt(x5, x5, null, null, null, null, null, DeclarationKind.TopLevel, null)
+        parseFieldInitializerOpt(x5, x5, late, null, null, null, null, DeclarationKind.TopLevel, null)
           listener: handleNoFieldInitializer(;)
-        listener: endTopLevelFields(null, null, null, null, null, null, 1, late, ;)
+        listener: endTopLevelFields(null, null, null, null, late, null, 1, late, ;)
   listener: endTopLevelDeclaration(;)
   parseTopLevelDeclarationImpl(;, DirectiveContext(DirectiveState.Declarations))
     parseMetadataStar(;)
@@ -204,100 +196,95 @@
           notEofOrValue(}, late)
           parseStatement(;)
             parseStatementX(;)
-              parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, null)
-                indicatesMethodOrField(;)
-                reportRecoverableErrorWithToken(late, Template(UnexpectedModifierInNonNnbd))
-                  listener: handleRecoverableError(Message[UnexpectedModifierInNonNnbd, The modifier 'late' is only available in null safe libraries., null, {lexeme: late}], late, late)
-                looksLikeLocalFunction(y2)
-                listener: beginMetadataStar(int)
-                listener: endMetadataStar(0)
-                listener: handleIdentifier(int, typeReference)
-                listener: handleNoTypeArguments(y2)
-                listener: handleType(int, null)
-                listener: beginVariablesDeclaration(y2, late, null)
-                parseVariablesDeclarationRest(int, true)
-                  parseOptionallyInitializedIdentifier(int)
-                    ensureIdentifier(int, localVariableDeclaration)
-                      listener: handleIdentifier(y2, localVariableDeclaration)
-                    listener: beginInitializedIdentifier(y2)
-                    parseVariableInitializerOpt(y2)
-                      listener: handleNoVariableInitializer(y2)
-                    listener: endInitializedIdentifier(y2)
-                  ensureSemicolon(y2)
-                  listener: endVariablesDeclaration(1, ;)
+              parseExpressionStatementOrDeclaration(;, null)
+                parseExpressionStatementOrDeclarationAfterModifiers(late, ;, late, null, null, null)
+                  looksLikeLocalFunction(y2)
+                  listener: beginMetadataStar(late)
+                  listener: endMetadataStar(0)
+                  listener: handleIdentifier(int, typeReference)
+                  listener: handleNoTypeArguments(y2)
+                  listener: handleType(int, null)
+                  listener: beginVariablesDeclaration(y2, late, null)
+                  parseVariablesDeclarationRest(int, true)
+                    parseOptionallyInitializedIdentifier(int)
+                      ensureIdentifier(int, localVariableDeclaration)
+                        listener: handleIdentifier(y2, localVariableDeclaration)
+                      listener: beginInitializedIdentifier(y2)
+                      parseVariableInitializerOpt(y2)
+                        listener: handleNoVariableInitializer(y2)
+                      listener: endInitializedIdentifier(y2)
+                    ensureSemicolon(y2)
+                    listener: endVariablesDeclaration(1, ;)
           notEofOrValue(}, late)
           parseStatement(;)
             parseStatementX(;)
-              parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, null)
-                indicatesMethodOrField(;)
-                reportRecoverableErrorWithToken(late, Template(UnexpectedModifierInNonNnbd))
-                  listener: handleRecoverableError(Message[UnexpectedModifierInNonNnbd, The modifier 'late' is only available in null safe libraries., null, {lexeme: late}], late, late)
-                looksLikeLocalFunction(y3)
-                listener: beginMetadataStar(List)
-                listener: endMetadataStar(0)
-                listener: handleIdentifier(List, typeReference)
-                listener: beginTypeArguments(<)
-                listener: handleIdentifier(int, typeReference)
-                listener: handleNoTypeArguments(>)
-                listener: handleType(int, null)
-                listener: endTypeArguments(1, <, >)
-                listener: handleType(List, null)
-                listener: beginVariablesDeclaration(y3, late, null)
-                parseVariablesDeclarationRest(>, true)
-                  parseOptionallyInitializedIdentifier(>)
-                    ensureIdentifier(>, localVariableDeclaration)
-                      listener: handleIdentifier(y3, localVariableDeclaration)
-                    listener: beginInitializedIdentifier(y3)
-                    parseVariableInitializerOpt(y3)
-                      listener: handleNoVariableInitializer(y3)
-                    listener: endInitializedIdentifier(y3)
-                  ensureSemicolon(y3)
-                  listener: endVariablesDeclaration(1, ;)
+              parseExpressionStatementOrDeclaration(;, null)
+                parseExpressionStatementOrDeclarationAfterModifiers(late, ;, late, null, null, null)
+                  looksLikeLocalFunction(y3)
+                  listener: beginMetadataStar(late)
+                  listener: endMetadataStar(0)
+                  listener: handleIdentifier(List, typeReference)
+                  listener: beginTypeArguments(<)
+                  listener: handleIdentifier(int, typeReference)
+                  listener: handleNoTypeArguments(>)
+                  listener: handleType(int, null)
+                  listener: endTypeArguments(1, <, >)
+                  listener: handleType(List, null)
+                  listener: beginVariablesDeclaration(y3, late, null)
+                  parseVariablesDeclarationRest(>, true)
+                    parseOptionallyInitializedIdentifier(>)
+                      ensureIdentifier(>, localVariableDeclaration)
+                        listener: handleIdentifier(y3, localVariableDeclaration)
+                      listener: beginInitializedIdentifier(y3)
+                      parseVariableInitializerOpt(y3)
+                        listener: handleNoVariableInitializer(y3)
+                      listener: endInitializedIdentifier(y3)
+                    ensureSemicolon(y3)
+                    listener: endVariablesDeclaration(1, ;)
           notEofOrValue(}, late)
           parseStatement(;)
             parseStatementX(;)
-              parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, null)
-                indicatesMethodOrField(;)
-                reportRecoverableErrorWithToken(late, Template(UnexpectedModifierInNonNnbd))
-                  listener: handleRecoverableError(Message[UnexpectedModifierInNonNnbd, The modifier 'late' is only available in null safe libraries., null, {lexeme: late}], late, late)
-                looksLikeLocalFunction(y4)
-                listener: beginMetadataStar(int)
-                listener: endMetadataStar(0)
-                listener: handleIdentifier(int, typeReference)
-                listener: handleNoTypeArguments(y4)
-                listener: handleType(int, null)
-                listener: beginVariablesDeclaration(y4, late, final)
-                parseVariablesDeclarationRest(int, true)
-                  parseOptionallyInitializedIdentifier(int)
-                    ensureIdentifier(int, localVariableDeclaration)
-                      listener: handleIdentifier(y4, localVariableDeclaration)
-                    listener: beginInitializedIdentifier(y4)
-                    parseVariableInitializerOpt(y4)
-                      listener: handleNoVariableInitializer(y4)
-                    listener: endInitializedIdentifier(y4)
-                  ensureSemicolon(y4)
-                  listener: endVariablesDeclaration(1, ;)
+              parseExpressionStatementOrDeclaration(;, null)
+                parseExpressionStatementOrDeclarationAfterModifiers(final, ;, late, final, null, null)
+                  looksLikeLocalFunction(y4)
+                  listener: beginMetadataStar(late)
+                  listener: endMetadataStar(0)
+                  listener: handleIdentifier(int, typeReference)
+                  listener: handleNoTypeArguments(y4)
+                  listener: handleType(int, null)
+                  listener: beginVariablesDeclaration(y4, late, final)
+                  parseVariablesDeclarationRest(int, true)
+                    parseOptionallyInitializedIdentifier(int)
+                      ensureIdentifier(int, localVariableDeclaration)
+                        listener: handleIdentifier(y4, localVariableDeclaration)
+                      listener: beginInitializedIdentifier(y4)
+                      parseVariableInitializerOpt(y4)
+                        listener: handleNoVariableInitializer(y4)
+                      listener: endInitializedIdentifier(y4)
+                    ensureSemicolon(y4)
+                    listener: endVariablesDeclaration(1, ;)
           notEofOrValue(}, late)
           parseStatement(;)
             parseStatementX(;)
-              parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, null)
-                looksLikeLocalFunction(y5)
-                listener: beginMetadataStar(late)
-                listener: endMetadataStar(0)
-                listener: handleIdentifier(late, typeReference)
-                listener: handleNoTypeArguments(y5)
-                listener: handleType(late, null)
-                listener: beginVariablesDeclaration(y5, null, null)
-                parseVariablesDeclarationRest(late, true)
-                  parseOptionallyInitializedIdentifier(late)
-                    ensureIdentifier(late, localVariableDeclaration)
-                      listener: handleIdentifier(y5, localVariableDeclaration)
-                    listener: beginInitializedIdentifier(y5)
-                    parseVariableInitializerOpt(y5)
-                      listener: handleNoVariableInitializer(y5)
-                    listener: endInitializedIdentifier(y5)
-                  ensureSemicolon(y5)
-                  listener: endVariablesDeclaration(1, ;)
+              parseExpressionStatementOrDeclaration(;, null)
+                parseExpressionStatementOrDeclarationAfterModifiers(late, ;, late, null, null, null)
+                  looksLikeLocalFunction(y5)
+                  reportRecoverableError(y5, MissingConstFinalVarOrType)
+                    listener: handleRecoverableError(MissingConstFinalVarOrType, y5, y5)
+                  listener: beginMetadataStar(late)
+                  listener: endMetadataStar(0)
+                  listener: handleNoType(late)
+                  listener: beginVariablesDeclaration(y5, late, null)
+                  parseVariablesDeclarationRest(late, true)
+                    parseOptionallyInitializedIdentifier(late)
+                      ensureIdentifier(late, localVariableDeclaration)
+                        listener: handleIdentifier(y5, localVariableDeclaration)
+                      listener: beginInitializedIdentifier(y5)
+                      parseVariableInitializerOpt(y5)
+                        listener: handleNoVariableInitializer(y5)
+                      listener: endInitializedIdentifier(y5)
+                    ensureSemicolon(y5)
+                    listener: endVariablesDeclaration(1, ;)
           notEofOrValue(}, ;)
           parseStatement(;)
             parseStatementX(;)
@@ -306,24 +293,27 @@
           notEofOrValue(}, late)
           parseStatement(;)
             parseStatementX(;)
-              parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, null)
-                looksLikeLocalFunction(late)
-                parseExpressionStatement(;)
-                  parseExpression(;)
-                    parsePrecedenceExpression(;, 1, true, ConstantPatternContext.none)
-                      parseUnaryExpression(;, true, ConstantPatternContext.none)
-                        parsePrimary(;, expression, ConstantPatternContext.none)
-                          parseSendOrFunctionLiteral(;, expression, ConstantPatternContext.none)
-                            parseSend(;, expression, ConstantPatternContext.none)
-                              isNextIdentifier(;)
-                              ensureIdentifier(;, expression)
-                                listener: handleIdentifier(late, expression)
-                              listener: handleNoTypeArguments(;)
-                              parseArgumentsOpt(late)
-                                listener: handleNoArguments(;)
-                              listener: handleSend(late, late)
-                  ensureSemicolon(late)
-                  listener: handleExpressionStatement(late, ;)
+              parseExpressionStatementOrDeclaration(;, null)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, null)
+                  looksLikeLocalFunction(late)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true, ConstantPatternContext.none)
+                        parseUnaryExpression(;, true, ConstantPatternContext.none)
+                          parsePrimary(;, expression, ConstantPatternContext.none)
+                            inPlainSync()
+                            parseSendOrFunctionLiteral(;, expression, ConstantPatternContext.none)
+                              parseSend(;, expression, ConstantPatternContext.none)
+                                isNextIdentifier(;)
+                                ensureIdentifier(;, expression)
+                                  inPlainSync()
+                                  listener: handleIdentifier(late, expression)
+                                listener: handleNoTypeArguments(;)
+                                parseArgumentsOpt(late)
+                                  listener: handleNoArguments(;)
+                                listener: handleSend(late, late)
+                    ensureSemicolon(late)
+                    listener: handleExpressionStatement(late, ;)
           notEofOrValue(}, ;)
           parseStatement(;)
             parseStatementX(;)
@@ -378,12 +368,9 @@
               parseMetadataStar(;)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
-              indicatesMethodOrField(;)
-              reportRecoverableErrorWithToken(late, Template(UnexpectedModifierInNonNnbd))
-                listener: handleRecoverableError(Message[UnexpectedModifierInNonNnbd, The modifier 'late' is only available in null safe libraries., null, {lexeme: late}], late, late)
               listener: beginMember()
-              parseFields(late, null, null, null, null, null, late, null, late, SimpleType(), z2, DeclarationKind.Class, Foo, false)
-                listener: beginFields(DeclarationKind.Class, null, null, null, null, null, late, null, late)
+              parseFields(;, null, null, null, null, null, late, null, late, SimpleType(), z2, DeclarationKind.Class, Foo, false)
+                listener: beginFields(DeclarationKind.Class, null, null, null, null, null, late, null, ;)
                 listener: handleIdentifier(int, typeReference)
                 listener: handleNoTypeArguments(z2)
                 listener: handleType(int, null)
@@ -391,19 +378,16 @@
                   listener: handleIdentifier(z2, fieldDeclaration)
                 parseFieldInitializerOpt(z2, z2, late, null, null, null, null, DeclarationKind.Class, Foo)
                   listener: handleNoFieldInitializer(;)
-                listener: endClassFields(null, null, null, null, null, late, null, 1, int, ;)
+                listener: endClassFields(null, null, null, null, null, late, null, 1, late, ;)
               listener: endMember()
             notEofOrValue(}, late)
             parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
-              indicatesMethodOrField(;)
-              reportRecoverableErrorWithToken(late, Template(UnexpectedModifierInNonNnbd))
-                listener: handleRecoverableError(Message[UnexpectedModifierInNonNnbd, The modifier 'late' is only available in null safe libraries., null, {lexeme: late}], late, late)
               listener: beginMember()
-              parseFields(late, null, null, null, null, null, late, null, late, SimpleTypeWith1Argument(typeArg: SimpleTypeArgument1()), x3, DeclarationKind.Class, Foo, false)
-                listener: beginFields(DeclarationKind.Class, null, null, null, null, null, late, null, late)
+              parseFields(;, null, null, null, null, null, late, null, late, SimpleTypeWith1Argument(typeArg: SimpleTypeArgument1()), x3, DeclarationKind.Class, Foo, false)
+                listener: beginFields(DeclarationKind.Class, null, null, null, null, null, late, null, ;)
                 listener: handleIdentifier(List, typeReference)
                 listener: beginTypeArguments(<)
                 listener: handleIdentifier(int, typeReference)
@@ -415,21 +399,18 @@
                   listener: handleIdentifier(x3, fieldDeclaration)
                 parseFieldInitializerOpt(x3, x3, late, null, null, null, null, DeclarationKind.Class, Foo)
                   listener: handleNoFieldInitializer(;)
-                listener: endClassFields(null, null, null, null, null, late, null, 1, List, ;)
+                listener: endClassFields(null, null, null, null, null, late, null, 1, late, ;)
               listener: endMember()
             notEofOrValue(}, late)
             parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
-              indicatesMethodOrField(;)
-              reportRecoverableErrorWithToken(late, Template(UnexpectedModifierInNonNnbd))
-                listener: handleRecoverableError(Message[UnexpectedModifierInNonNnbd, The modifier 'late' is only available in null safe libraries., null, {lexeme: late}], late, late)
               listener: beginMember()
               skipOuterPattern(final)
                 skipObjectPatternRest(int)
-              parseFields(late, null, null, null, null, null, late, final, final, SimpleType(), z4, DeclarationKind.Class, Foo, false)
-                listener: beginFields(DeclarationKind.Class, null, null, null, null, null, late, final, late)
+              parseFields(;, null, null, null, null, null, late, final, final, SimpleType(), z4, DeclarationKind.Class, Foo, false)
+                listener: beginFields(DeclarationKind.Class, null, null, null, null, null, late, final, ;)
                 listener: handleIdentifier(int, typeReference)
                 listener: handleNoTypeArguments(z4)
                 listener: handleType(int, null)
@@ -437,7 +418,7 @@
                   listener: handleIdentifier(z4, fieldDeclaration)
                 parseFieldInitializerOpt(z4, z4, late, null, null, null, final, DeclarationKind.Class, Foo)
                   listener: handleNoFieldInitializer(;)
-                listener: endClassFields(null, null, null, null, null, late, final, 1, final, ;)
+                listener: endClassFields(null, null, null, null, null, late, final, 1, late, ;)
               listener: endMember()
             notEofOrValue(}, late)
             parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
@@ -445,16 +426,17 @@
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFields(;, null, null, null, null, null, null, null, ;, SimpleType(), z5, DeclarationKind.Class, Foo, false)
-                listener: beginFields(DeclarationKind.Class, null, null, null, null, null, null, null, ;)
-                listener: handleIdentifier(late, typeReference)
-                listener: handleNoTypeArguments(z5)
-                listener: handleType(late, null)
+              isReservedKeyword(;)
+              parseFields(;, null, null, null, null, null, late, null, late, NoType(), z5, DeclarationKind.Class, Foo, false)
+                listener: beginFields(DeclarationKind.Class, null, null, null, null, null, late, null, ;)
+                reportRecoverableError(z5, MissingConstFinalVarOrType)
+                  listener: handleRecoverableError(MissingConstFinalVarOrType, z5, z5)
+                listener: handleNoType(late)
                 ensureIdentifierPotentiallyRecovered(late, fieldDeclaration, false)
                   listener: handleIdentifier(z5, fieldDeclaration)
-                parseFieldInitializerOpt(z5, z5, null, null, null, null, null, DeclarationKind.Class, Foo)
+                parseFieldInitializerOpt(z5, z5, late, null, null, null, null, DeclarationKind.Class, Foo)
                   listener: handleNoFieldInitializer(;)
-                listener: endClassFields(null, null, null, null, null, null, null, 1, late, ;)
+                listener: endClassFields(null, null, null, null, null, late, null, 1, late, ;)
               listener: endMember()
             notEofOrValue(}, ;)
             parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
@@ -473,7 +455,6 @@
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              isReservedKeyword(;)
               parseFields(;, null, null, null, null, null, null, null, ;, NoType(), late, DeclarationKind.Class, Foo, false)
                 listener: beginFields(DeclarationKind.Class, null, null, null, null, null, null, null, ;)
                 reportRecoverableError(late, MissingConstFinalVarOrType)
diff --git a/pkg/front_end/parser_testcases/also-nnbd/use_late_in_non_nnbd.dart.parser.expect b/pkg/front_end/parser_testcases/also-nnbd/use_late_in_non_nnbd.dart.parser.expect
new file mode 100644
index 0000000..5150444
--- /dev/null
+++ b/pkg/front_end/parser_testcases/also-nnbd/use_late_in_non_nnbd.dart.parser.expect
@@ -0,0 +1,61 @@
+int x1;
+late int x2;
+late List<int> x3;
+late final int x4;
+late x5;
+;
+late;
+;
+
+main(List<String> args) {
+int y1;
+late int y2;
+late List<int> y3;
+late final int y4;
+late y5;
+;
+late;
+;
+}
+
+class Foo {
+int z1;
+late int z2;
+late List<int> x3;
+late final int z4;
+late z5;
+;
+late;
+;
+}
+
+int[StringToken] x1[StringToken];[SimpleToken]
+late[KeywordToken] int[StringToken] x2[StringToken];[SimpleToken]
+late[KeywordToken] List[StringToken]<[BeginToken]int[StringToken]>[SimpleToken] x3[StringToken];[SimpleToken]
+late[KeywordToken] final[KeywordToken] int[StringToken] x4[StringToken];[SimpleToken]
+late[KeywordToken] x5[StringToken];[SimpleToken]
+;[SimpleToken]
+late[KeywordToken];[SimpleToken]
+;[SimpleToken]
+
+main[StringToken]([BeginToken]List[StringToken]<[BeginToken]String[StringToken]>[SimpleToken] args[StringToken])[SimpleToken] {[BeginToken]
+int[StringToken] y1[StringToken];[SimpleToken]
+late[KeywordToken] int[StringToken] y2[StringToken];[SimpleToken]
+late[KeywordToken] List[StringToken]<[BeginToken]int[StringToken]>[SimpleToken] y3[StringToken];[SimpleToken]
+late[KeywordToken] final[KeywordToken] int[StringToken] y4[StringToken];[SimpleToken]
+late[KeywordToken] y5[StringToken];[SimpleToken]
+;[SimpleToken]
+late[KeywordToken];[SimpleToken]
+;[SimpleToken]
+}[SimpleToken]
+
+class[KeywordToken] Foo[StringToken] {[BeginToken]
+int[StringToken] z1[StringToken];[SimpleToken]
+late[KeywordToken] int[StringToken] z2[StringToken];[SimpleToken]
+late[KeywordToken] List[StringToken]<[BeginToken]int[StringToken]>[SimpleToken] x3[StringToken];[SimpleToken]
+late[KeywordToken] final[KeywordToken] int[StringToken] z4[StringToken];[SimpleToken]
+late[KeywordToken] z5[StringToken];[SimpleToken]
+;[SimpleToken]
+late[KeywordToken];[SimpleToken]
+;[SimpleToken]
+}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/also-nnbd/use_late_in_non_nnbd.dart.scanner.expect b/pkg/front_end/parser_testcases/also-nnbd/use_late_in_non_nnbd.dart.scanner.expect
new file mode 100644
index 0000000..5150444
--- /dev/null
+++ b/pkg/front_end/parser_testcases/also-nnbd/use_late_in_non_nnbd.dart.scanner.expect
@@ -0,0 +1,61 @@
+int x1;
+late int x2;
+late List<int> x3;
+late final int x4;
+late x5;
+;
+late;
+;
+
+main(List<String> args) {
+int y1;
+late int y2;
+late List<int> y3;
+late final int y4;
+late y5;
+;
+late;
+;
+}
+
+class Foo {
+int z1;
+late int z2;
+late List<int> x3;
+late final int z4;
+late z5;
+;
+late;
+;
+}
+
+int[StringToken] x1[StringToken];[SimpleToken]
+late[KeywordToken] int[StringToken] x2[StringToken];[SimpleToken]
+late[KeywordToken] List[StringToken]<[BeginToken]int[StringToken]>[SimpleToken] x3[StringToken];[SimpleToken]
+late[KeywordToken] final[KeywordToken] int[StringToken] x4[StringToken];[SimpleToken]
+late[KeywordToken] x5[StringToken];[SimpleToken]
+;[SimpleToken]
+late[KeywordToken];[SimpleToken]
+;[SimpleToken]
+
+main[StringToken]([BeginToken]List[StringToken]<[BeginToken]String[StringToken]>[SimpleToken] args[StringToken])[SimpleToken] {[BeginToken]
+int[StringToken] y1[StringToken];[SimpleToken]
+late[KeywordToken] int[StringToken] y2[StringToken];[SimpleToken]
+late[KeywordToken] List[StringToken]<[BeginToken]int[StringToken]>[SimpleToken] y3[StringToken];[SimpleToken]
+late[KeywordToken] final[KeywordToken] int[StringToken] y4[StringToken];[SimpleToken]
+late[KeywordToken] y5[StringToken];[SimpleToken]
+;[SimpleToken]
+late[KeywordToken];[SimpleToken]
+;[SimpleToken]
+}[SimpleToken]
+
+class[KeywordToken] Foo[StringToken] {[BeginToken]
+int[StringToken] z1[StringToken];[SimpleToken]
+late[KeywordToken] int[StringToken] z2[StringToken];[SimpleToken]
+late[KeywordToken] List[StringToken]<[BeginToken]int[StringToken]>[SimpleToken] x3[StringToken];[SimpleToken]
+late[KeywordToken] final[KeywordToken] int[StringToken] z4[StringToken];[SimpleToken]
+late[KeywordToken] z5[StringToken];[SimpleToken]
+;[SimpleToken]
+late[KeywordToken];[SimpleToken]
+;[SimpleToken]
+}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart b/pkg/front_end/parser_testcases/also-nnbd/use_required_in_non_nnbd.dart
similarity index 100%
rename from pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart
rename to pkg/front_end/parser_testcases/also-nnbd/use_required_in_non_nnbd.dart
diff --git a/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.expect b/pkg/front_end/parser_testcases/also-nnbd/use_required_in_non_nnbd.dart.expect
similarity index 78%
rename from pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.expect
rename to pkg/front_end/parser_testcases/also-nnbd/use_required_in_non_nnbd.dart.expect
index ae4eb2bb..b752193 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.expect
+++ b/pkg/front_end/parser_testcases/also-nnbd/use_required_in_non_nnbd.dart.expect
@@ -1,17 +1,13 @@
 Problems reported:
 
-parser/non-nnbd/use_required_in_non_nnbd:1:12: The modifier 'required' is only available in null safe libraries.
-void foo1({required int x1}) {
-           ^^^^^^^^
+parser/also-nnbd/use_required_in_non_nnbd:9:21: The modifier 'required' was already specified.
+void foo3({required required x3}) {
+                    ^^^^^^^^
 
-parser/non-nnbd/use_required_in_non_nnbd:9:12: The modifier 'required' is only available in null safe libraries.
+parser/also-nnbd/use_required_in_non_nnbd:9:12: Can't have modifier 'required' here.
 void foo3({required required x3}) {
            ^^^^^^^^
 
-parser/non-nnbd/use_required_in_non_nnbd:14:14: The modifier 'required' is only available in null safe libraries.
-  void foo4({required covariant int x4}) {
-             ^^^^^^^^
-
 beginCompilationUnit(void)
   beginMetadataStar(void)
   endMetadataStar(0)
@@ -24,14 +20,13 @@
         beginOptionalFormalParameters({)
           beginMetadataStar(required)
           endMetadataStar(0)
-          handleRecoverableError(Message[UnexpectedModifierInNonNnbd, The modifier 'required' is only available in null safe libraries., null, {lexeme: required}], required, required)
-          beginFormalParameter(int, MemberKind.TopLevelMethod, required, null, null)
+          beginFormalParameter(required, MemberKind.TopLevelMethod, required, null, null)
             handleIdentifier(int, typeReference)
             handleNoTypeArguments(x1)
             handleType(int, null)
             handleIdentifier(x1, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, null, x1, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, x1, null, null, FormalParameterKind.requiredNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, }, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -60,13 +55,11 @@
         beginOptionalFormalParameters({)
           beginMetadataStar(required)
           endMetadataStar(0)
-          beginFormalParameter(required, MemberKind.TopLevelMethod, null, null, null)
-            handleIdentifier(required, typeReference)
-            handleNoTypeArguments(x2)
-            handleType(required, null)
+          beginFormalParameter(required, MemberKind.TopLevelMethod, required, null, null)
+            handleNoType(required)
             handleIdentifier(x2, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, null, x2, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, x2, null, null, FormalParameterKind.requiredNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, }, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -95,14 +88,13 @@
         beginOptionalFormalParameters({)
           beginMetadataStar(required)
           endMetadataStar(0)
-          handleRecoverableError(Message[UnexpectedModifierInNonNnbd, The modifier 'required' is only available in null safe libraries., null, {lexeme: required}], required, required)
+          handleRecoverableError(Message[DuplicatedModifier, The modifier 'required' was already specified., Try removing all but one occurrence of the modifier., {lexeme: required}], required, required)
+          handleRecoverableError(Message[ExtraneousModifier, Can't have modifier 'required' here., Try removing 'required'., {lexeme: required}], required, required)
           beginFormalParameter(required, MemberKind.TopLevelMethod, required, null, null)
-            handleIdentifier(required, typeReference)
-            handleNoTypeArguments(x3)
-            handleType(required, null)
+            handleNoType(required)
             handleIdentifier(x3, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, null, x3, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, x3, null, null, FormalParameterKind.requiredNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, }, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -143,14 +135,13 @@
               beginOptionalFormalParameters({)
                 beginMetadataStar(required)
                 endMetadataStar(0)
-                handleRecoverableError(Message[UnexpectedModifierInNonNnbd, The modifier 'required' is only available in null safe libraries., null, {lexeme: required}], required, required)
-                beginFormalParameter(covariant, MemberKind.NonStaticMethod, required, covariant, null)
+                beginFormalParameter(required, MemberKind.NonStaticMethod, required, covariant, null)
                   handleIdentifier(int, typeReference)
                   handleNoTypeArguments(x4)
                   handleType(int, null)
                   handleIdentifier(x4, formalParameterDeclaration)
                   handleFormalParameterWithoutValue(})
-                endFormalParameter(null, null, null, x4, null, null, FormalParameterKind.optionalNamed, MemberKind.NonStaticMethod)
+                endFormalParameter(null, null, null, x4, null, null, FormalParameterKind.requiredNamed, MemberKind.NonStaticMethod)
               endOptionalFormalParameters(1, {, }, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.intertwined.expect b/pkg/front_end/parser_testcases/also-nnbd/use_required_in_non_nnbd.dart.intertwined.expect
similarity index 92%
rename from pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.intertwined.expect
rename to pkg/front_end/parser_testcases/also-nnbd/use_required_in_non_nnbd.dart.intertwined.expect
index 65914e6..a2cc0d9 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/also-nnbd/use_required_in_non_nnbd.dart.intertwined.expect
@@ -25,16 +25,14 @@
                   parseMetadataStar({)
                     listener: beginMetadataStar(required)
                     listener: endMetadataStar(0)
-                  reportRecoverableErrorWithToken(required, Template(UnexpectedModifierInNonNnbd))
-                    listener: handleRecoverableError(Message[UnexpectedModifierInNonNnbd, The modifier 'required' is only available in null safe libraries., null, {lexeme: required}], required, required)
-                  listener: beginFormalParameter(int, MemberKind.TopLevelMethod, required, null, null)
+                  listener: beginFormalParameter(required, MemberKind.TopLevelMethod, required, null, null)
                   listener: handleIdentifier(int, typeReference)
                   listener: handleNoTypeArguments(x1)
                   listener: handleType(int, null)
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(x1, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, null, x1, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, x1, null, null, FormalParameterKind.requiredNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, }, MemberKind.TopLevelMethod)
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -108,14 +106,12 @@
                   parseMetadataStar({)
                     listener: beginMetadataStar(required)
                     listener: endMetadataStar(0)
-                  listener: beginFormalParameter(required, MemberKind.TopLevelMethod, null, null, null)
-                  listener: handleIdentifier(required, typeReference)
-                  listener: handleNoTypeArguments(x2)
-                  listener: handleType(required, null)
+                  listener: beginFormalParameter(required, MemberKind.TopLevelMethod, required, null, null)
+                  listener: handleNoType(required)
                   ensureIdentifier(required, formalParameterDeclaration)
                     listener: handleIdentifier(x2, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, null, x2, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, x2, null, null, FormalParameterKind.requiredNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, }, MemberKind.TopLevelMethod)
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -189,16 +185,16 @@
                   parseMetadataStar({)
                     listener: beginMetadataStar(required)
                     listener: endMetadataStar(0)
-                  reportRecoverableErrorWithToken(required, Template(UnexpectedModifierInNonNnbd))
-                    listener: handleRecoverableError(Message[UnexpectedModifierInNonNnbd, The modifier 'required' is only available in null safe libraries., null, {lexeme: required}], required, required)
+                  reportRecoverableErrorWithToken(required, Template(DuplicatedModifier))
+                    listener: handleRecoverableError(Message[DuplicatedModifier, The modifier 'required' was already specified., Try removing all but one occurrence of the modifier., {lexeme: required}], required, required)
+                  reportRecoverableErrorWithToken(required, Template(ExtraneousModifier))
+                    listener: handleRecoverableError(Message[ExtraneousModifier, Can't have modifier 'required' here., Try removing 'required'., {lexeme: required}], required, required)
                   listener: beginFormalParameter(required, MemberKind.TopLevelMethod, required, null, null)
-                  listener: handleIdentifier(required, typeReference)
-                  listener: handleNoTypeArguments(x3)
-                  listener: handleType(required, null)
+                  listener: handleNoType(required)
                   ensureIdentifier(required, formalParameterDeclaration)
                     listener: handleIdentifier(x3, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, null, x3, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, x3, null, null, FormalParameterKind.requiredNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, }, MemberKind.TopLevelMethod)
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -296,16 +292,14 @@
                           parseMetadataStar({)
                             listener: beginMetadataStar(required)
                             listener: endMetadataStar(0)
-                          reportRecoverableErrorWithToken(required, Template(UnexpectedModifierInNonNnbd))
-                            listener: handleRecoverableError(Message[UnexpectedModifierInNonNnbd, The modifier 'required' is only available in null safe libraries., null, {lexeme: required}], required, required)
-                          listener: beginFormalParameter(covariant, MemberKind.NonStaticMethod, required, covariant, null)
+                          listener: beginFormalParameter(required, MemberKind.NonStaticMethod, required, covariant, null)
                           listener: handleIdentifier(int, typeReference)
                           listener: handleNoTypeArguments(x4)
                           listener: handleType(int, null)
                           ensureIdentifier(int, formalParameterDeclaration)
                             listener: handleIdentifier(x4, formalParameterDeclaration)
                           listener: handleFormalParameterWithoutValue(})
-                          listener: endFormalParameter(null, null, null, x4, null, null, FormalParameterKind.optionalNamed, MemberKind.NonStaticMethod)
+                          listener: endFormalParameter(null, null, null, x4, null, null, FormalParameterKind.requiredNamed, MemberKind.NonStaticMethod)
                         listener: endOptionalFormalParameters(1, {, }, MemberKind.NonStaticMethod)
                       ensureCloseParen(}, ()
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
diff --git a/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.parser.expect b/pkg/front_end/parser_testcases/also-nnbd/use_required_in_non_nnbd.dart.parser.expect
similarity index 69%
rename from pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.parser.expect
rename to pkg/front_end/parser_testcases/also-nnbd/use_required_in_non_nnbd.dart.parser.expect
index 468262a..bb8bfc5 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.parser.expect
+++ b/pkg/front_end/parser_testcases/also-nnbd/use_required_in_non_nnbd.dart.parser.expect
@@ -16,20 +16,20 @@
 }
 }
 
-void[KeywordToken] foo1[StringToken]([BeginToken]{[BeginToken]required[StringToken] int[StringToken] x1[StringToken]}[SimpleToken])[SimpleToken] {[BeginToken]
+void[KeywordToken] foo1[StringToken]([BeginToken]{[BeginToken]required[KeywordToken] int[StringToken] x1[StringToken]}[SimpleToken])[SimpleToken] {[BeginToken]
 print[StringToken]([BeginToken]x[StringToken])[SimpleToken];[SimpleToken]
 }[SimpleToken]
 
-void[KeywordToken] foo2[StringToken]([BeginToken]{[BeginToken]required[StringToken] x2[StringToken]}[SimpleToken])[SimpleToken] {[BeginToken]
+void[KeywordToken] foo2[StringToken]([BeginToken]{[BeginToken]required[KeywordToken] x2[StringToken]}[SimpleToken])[SimpleToken] {[BeginToken]
 print[StringToken]([BeginToken]x[StringToken])[SimpleToken];[SimpleToken]
 }[SimpleToken]
 
-void[KeywordToken] foo3[StringToken]([BeginToken]{[BeginToken]required[StringToken] required[StringToken] x3[StringToken]}[SimpleToken])[SimpleToken] {[BeginToken]
+void[KeywordToken] foo3[StringToken]([BeginToken]{[BeginToken]required[KeywordToken] required[KeywordToken] x3[StringToken]}[SimpleToken])[SimpleToken] {[BeginToken]
 print[StringToken]([BeginToken]x[StringToken])[SimpleToken];[SimpleToken]
 }[SimpleToken]
 
 class[KeywordToken] Foo[StringToken] {[BeginToken]
-void[KeywordToken] foo4[StringToken]([BeginToken]{[BeginToken]required[StringToken] covariant[KeywordToken] int[StringToken] x4[StringToken]}[SimpleToken])[SimpleToken] {[BeginToken]
+void[KeywordToken] foo4[StringToken]([BeginToken]{[BeginToken]required[KeywordToken] covariant[KeywordToken] int[StringToken] x4[StringToken]}[SimpleToken])[SimpleToken] {[BeginToken]
 print[StringToken]([BeginToken]x[StringToken])[SimpleToken];[SimpleToken]
 }[SimpleToken]
 }[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.scanner.expect b/pkg/front_end/parser_testcases/also-nnbd/use_required_in_non_nnbd.dart.scanner.expect
similarity index 69%
rename from pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.scanner.expect
rename to pkg/front_end/parser_testcases/also-nnbd/use_required_in_non_nnbd.dart.scanner.expect
index 468262a..bb8bfc5 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.scanner.expect
+++ b/pkg/front_end/parser_testcases/also-nnbd/use_required_in_non_nnbd.dart.scanner.expect
@@ -16,20 +16,20 @@
 }
 }
 
-void[KeywordToken] foo1[StringToken]([BeginToken]{[BeginToken]required[StringToken] int[StringToken] x1[StringToken]}[SimpleToken])[SimpleToken] {[BeginToken]
+void[KeywordToken] foo1[StringToken]([BeginToken]{[BeginToken]required[KeywordToken] int[StringToken] x1[StringToken]}[SimpleToken])[SimpleToken] {[BeginToken]
 print[StringToken]([BeginToken]x[StringToken])[SimpleToken];[SimpleToken]
 }[SimpleToken]
 
-void[KeywordToken] foo2[StringToken]([BeginToken]{[BeginToken]required[StringToken] x2[StringToken]}[SimpleToken])[SimpleToken] {[BeginToken]
+void[KeywordToken] foo2[StringToken]([BeginToken]{[BeginToken]required[KeywordToken] x2[StringToken]}[SimpleToken])[SimpleToken] {[BeginToken]
 print[StringToken]([BeginToken]x[StringToken])[SimpleToken];[SimpleToken]
 }[SimpleToken]
 
-void[KeywordToken] foo3[StringToken]([BeginToken]{[BeginToken]required[StringToken] required[StringToken] x3[StringToken]}[SimpleToken])[SimpleToken] {[BeginToken]
+void[KeywordToken] foo3[StringToken]([BeginToken]{[BeginToken]required[KeywordToken] required[KeywordToken] x3[StringToken]}[SimpleToken])[SimpleToken] {[BeginToken]
 print[StringToken]([BeginToken]x[StringToken])[SimpleToken];[SimpleToken]
 }[SimpleToken]
 
 class[KeywordToken] Foo[StringToken] {[BeginToken]
-void[KeywordToken] foo4[StringToken]([BeginToken]{[BeginToken]required[StringToken] covariant[KeywordToken] int[StringToken] x4[StringToken]}[SimpleToken])[SimpleToken] {[BeginToken]
+void[KeywordToken] foo4[StringToken]([BeginToken]{[BeginToken]required[KeywordToken] covariant[KeywordToken] int[StringToken] x4[StringToken]}[SimpleToken])[SimpleToken] {[BeginToken]
 print[StringToken]([BeginToken]x[StringToken])[SimpleToken];[SimpleToken]
 }[SimpleToken]
 }[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.parser.expect b/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.parser.expect
deleted file mode 100644
index ffd3e65..0000000
--- a/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.parser.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-class late {
-int get g => 1;
-}
-
-class required {
-int get g => 2;
-}
-
-class C {
-late l = late();
-required r = required();
-}
-
-
-class[KeywordToken] late[StringToken] {[BeginToken]
-int[StringToken] get[KeywordToken] g[StringToken] =>[SimpleToken] 1[StringToken];[SimpleToken]
-}[SimpleToken]
-
-class[KeywordToken] required[StringToken] {[BeginToken]
-int[StringToken] get[KeywordToken] g[StringToken] =>[SimpleToken] 2[StringToken];[SimpleToken]
-}[SimpleToken]
-
-class[KeywordToken] C[StringToken] {[BeginToken]
-late[StringToken] l[StringToken] =[SimpleToken] late[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
-required[StringToken] r[StringToken] =[SimpleToken] required[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
-}[SimpleToken]
-[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.scanner.expect b/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.scanner.expect
deleted file mode 100644
index ffd3e65..0000000
--- a/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.scanner.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-class late {
-int get g => 1;
-}
-
-class required {
-int get g => 2;
-}
-
-class C {
-late l = late();
-required r = required();
-}
-
-
-class[KeywordToken] late[StringToken] {[BeginToken]
-int[StringToken] get[KeywordToken] g[StringToken] =>[SimpleToken] 1[StringToken];[SimpleToken]
-}[SimpleToken]
-
-class[KeywordToken] required[StringToken] {[BeginToken]
-int[StringToken] get[KeywordToken] g[StringToken] =>[SimpleToken] 2[StringToken];[SimpleToken]
-}[SimpleToken]
-
-class[KeywordToken] C[StringToken] {[BeginToken]
-late[StringToken] l[StringToken] =[SimpleToken] late[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
-required[StringToken] r[StringToken] =[SimpleToken] required[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
-}[SimpleToken]
-[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.parser.expect b/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.parser.expect
deleted file mode 100644
index 272afaa..0000000
--- a/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.parser.expect
+++ /dev/null
@@ -1,61 +0,0 @@
-int x1;
-late int x2;
-late List<int> x3;
-late final int x4;
-late x5;
-;
-late;
-;
-
-main(List<String> args) {
-int y1;
-late int y2;
-late List<int> y3;
-late final int y4;
-late y5;
-;
-late;
-;
-}
-
-class Foo {
-int z1;
-late int z2;
-late List<int> x3;
-late final int z4;
-late z5;
-;
-late;
-;
-}
-
-int[StringToken] x1[StringToken];[SimpleToken]
-late[StringToken] int[StringToken] x2[StringToken];[SimpleToken]
-late[StringToken] List[StringToken]<[BeginToken]int[StringToken]>[SimpleToken] x3[StringToken];[SimpleToken]
-late[StringToken] final[KeywordToken] int[StringToken] x4[StringToken];[SimpleToken]
-late[StringToken] x5[StringToken];[SimpleToken]
-;[SimpleToken]
-late[StringToken];[SimpleToken]
-;[SimpleToken]
-
-main[StringToken]([BeginToken]List[StringToken]<[BeginToken]String[StringToken]>[SimpleToken] args[StringToken])[SimpleToken] {[BeginToken]
-int[StringToken] y1[StringToken];[SimpleToken]
-late[StringToken] int[StringToken] y2[StringToken];[SimpleToken]
-late[StringToken] List[StringToken]<[BeginToken]int[StringToken]>[SimpleToken] y3[StringToken];[SimpleToken]
-late[StringToken] final[KeywordToken] int[StringToken] y4[StringToken];[SimpleToken]
-late[StringToken] y5[StringToken];[SimpleToken]
-;[SimpleToken]
-late[StringToken];[SimpleToken]
-;[SimpleToken]
-}[SimpleToken]
-
-class[KeywordToken] Foo[StringToken] {[BeginToken]
-int[StringToken] z1[StringToken];[SimpleToken]
-late[StringToken] int[StringToken] z2[StringToken];[SimpleToken]
-late[StringToken] List[StringToken]<[BeginToken]int[StringToken]>[SimpleToken] x3[StringToken];[SimpleToken]
-late[StringToken] final[KeywordToken] int[StringToken] z4[StringToken];[SimpleToken]
-late[StringToken] z5[StringToken];[SimpleToken]
-;[SimpleToken]
-late[StringToken];[SimpleToken]
-;[SimpleToken]
-}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.scanner.expect b/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.scanner.expect
deleted file mode 100644
index 272afaa..0000000
--- a/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.scanner.expect
+++ /dev/null
@@ -1,61 +0,0 @@
-int x1;
-late int x2;
-late List<int> x3;
-late final int x4;
-late x5;
-;
-late;
-;
-
-main(List<String> args) {
-int y1;
-late int y2;
-late List<int> y3;
-late final int y4;
-late y5;
-;
-late;
-;
-}
-
-class Foo {
-int z1;
-late int z2;
-late List<int> x3;
-late final int z4;
-late z5;
-;
-late;
-;
-}
-
-int[StringToken] x1[StringToken];[SimpleToken]
-late[StringToken] int[StringToken] x2[StringToken];[SimpleToken]
-late[StringToken] List[StringToken]<[BeginToken]int[StringToken]>[SimpleToken] x3[StringToken];[SimpleToken]
-late[StringToken] final[KeywordToken] int[StringToken] x4[StringToken];[SimpleToken]
-late[StringToken] x5[StringToken];[SimpleToken]
-;[SimpleToken]
-late[StringToken];[SimpleToken]
-;[SimpleToken]
-
-main[StringToken]([BeginToken]List[StringToken]<[BeginToken]String[StringToken]>[SimpleToken] args[StringToken])[SimpleToken] {[BeginToken]
-int[StringToken] y1[StringToken];[SimpleToken]
-late[StringToken] int[StringToken] y2[StringToken];[SimpleToken]
-late[StringToken] List[StringToken]<[BeginToken]int[StringToken]>[SimpleToken] y3[StringToken];[SimpleToken]
-late[StringToken] final[KeywordToken] int[StringToken] y4[StringToken];[SimpleToken]
-late[StringToken] y5[StringToken];[SimpleToken]
-;[SimpleToken]
-late[StringToken];[SimpleToken]
-;[SimpleToken]
-}[SimpleToken]
-
-class[KeywordToken] Foo[StringToken] {[BeginToken]
-int[StringToken] z1[StringToken];[SimpleToken]
-late[StringToken] int[StringToken] z2[StringToken];[SimpleToken]
-late[StringToken] List[StringToken]<[BeginToken]int[StringToken]>[SimpleToken] x3[StringToken];[SimpleToken]
-late[StringToken] final[KeywordToken] int[StringToken] z4[StringToken];[SimpleToken]
-late[StringToken] z5[StringToken];[SimpleToken]
-;[SimpleToken]
-late[StringToken];[SimpleToken]
-;[SimpleToken]
-}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/test/crashing_test_case_minimizer_impl.dart b/pkg/front_end/test/crashing_test_case_minimizer_impl.dart
index d90f233..d39742f 100644
--- a/pkg/front_end/test/crashing_test_case_minimizer_impl.dart
+++ b/pkg/front_end/test/crashing_test_case_minimizer_impl.dart
@@ -321,8 +321,7 @@
       } else {
         try {
           if (_knownByCompiler(uri!)) {
-            String parsedString =
-                _getFileAsStringContent(_fs.data[uri]!, _isUriNnbd(uri));
+            String parsedString = _getFileAsStringContent(_fs.data[uri]!);
             _fs.data[uri] = utf8.encode(parsedString);
           }
         } catch (e) {
@@ -557,11 +556,11 @@
       if (!uri.toString().endsWith(".dart")) continue;
       if (inlinableUri == uri) continue;
       final Uint8List? originalBytes = _fs.data[uri];
-      if (originalBytes == null || originalBytes.isEmpty) continue;
-      CompilationUnitEnd ast = getAST(originalBytes,
-          includeBody: false,
-          includeComments: false,
-          enableNonNullable: _isUriNnbd(uri!));
+      if (uri == null || originalBytes == null || originalBytes.isEmpty) {
+        continue;
+      }
+      CompilationUnitEnd ast =
+          getAST(originalBytes, includeBody: false, includeComments: false);
       // Find all imports/exports of this file (if any).
       // If finding any:
       // * remove all of them, then
@@ -598,10 +597,8 @@
       //   have a `library` declaration.
       // * The file we're inlining has a library declaration.
       int offsetOfLast = 0;
-      ast = getAST(withoutInlineable,
-          includeBody: false,
-          includeComments: false,
-          enableNonNullable: _isUriNnbd(uri));
+      ast =
+          getAST(withoutInlineable, includeBody: false, includeComments: false);
       for (ImportEnd import in ast.getImports()) {
         offsetOfLast = max(offsetOfLast, import.semicolon!.offset + 1);
       }
@@ -618,15 +615,15 @@
         builder.writeCharCode(withoutInlineableString.codeUnitAt(i));
       }
       builder.write("\n");
-      builder.write(utf8.decode(_rewriteImportsExportsToUri(
-          inlineData, uri, inlinableUri, _isUriNnbd(inlinableUri))));
+      builder.write(utf8
+          .decode(_rewriteImportsExportsToUri(inlineData, uri, inlinableUri)));
       builder.write("\n");
       for (int i = offsetOfLast; i < withoutInlineableString.length; i++) {
         builder.writeCharCode(withoutInlineableString.codeUnitAt(i));
       }
       final Uint8List inlinedWithoutChange = utf8.encode(builder.toString());
 
-      if (!_parsesWithoutError(inlinedWithoutChange, _isUriNnbd(uri))) {
+      if (!_parsesWithoutError(inlinedWithoutChange)) {
         print("WARNING: Parser error after stuff at ${StackTrace.current}");
       }
 
@@ -658,7 +655,7 @@
         }
         builder.write("\n");
         builder.write(utf8.decode(_rewriteImportsExportsToUri(
-            inlineData, uri, inlinableUri, _isUriNnbd(inlinableUri),
+            inlineData, uri, inlinableUri,
             convertExportToImport: true)));
         builder.write("\n");
         for (int i = offsetOfLast; i < withoutInlineableString.length; i++) {
@@ -666,7 +663,7 @@
         }
         Uint8List inlinedWithChange = utf8.encode(builder.toString());
 
-        if (!_parsesWithoutError(inlinedWithChange, _isUriNnbd(uri))) {
+        if (!_parsesWithoutError(inlinedWithChange)) {
           print("WARNING: Parser error after stuff at ${StackTrace.current}");
         }
 
@@ -699,10 +696,10 @@
   }
 
   Uint8List _rewriteImportsExportsToUri(
-      Uint8List oldData, Uri newUri, Uri oldUri, bool nnbd,
+      Uint8List oldData, Uri newUri, Uri oldUri,
       {bool convertExportToImport = false}) {
-    CompilationUnitEnd ast = getAST(oldData,
-        includeBody: false, includeComments: false, enableNonNullable: nnbd);
+    CompilationUnitEnd ast =
+        getAST(oldData, includeBody: false, includeComments: false);
     List<_Replacement> replacements = [];
     for (ImportEnd import in ast.getImports()) {
       _rewriteImportsExportsToUriInternal(
@@ -1040,10 +1037,7 @@
           // Because textual outline doesn't do the right thing for nnbd, only
           // replace if it's syntactically valid.
           if (candidate.length != _fs.data[uri]!.length &&
-              _parsesWithoutError(
-                  candidate,
-                  languageVersion >=
-                      ExperimentalFlag.nonNullable.enabledVersion)) {
+              _parsesWithoutError(candidate)) {
             if (await _shouldQuit()) return;
             _fs.data[uri] = candidate;
             if (!await _crashesOnCompile(initialComponent)) {
@@ -1124,10 +1118,8 @@
 
     List<int> lineStarts = [];
 
-    Token firstToken = parser_suite.scanRawBytes(
-        data,
-        _isUriNnbd(uri) ? _scannerConfiguration : _scannerConfigurationNonNNBD,
-        lineStarts);
+    Token firstToken =
+        parser_suite.scanRawBytes(data, _scannerConfiguration, lineStarts);
 
     int compileTry = 0;
     Token? token = firstToken;
@@ -1292,10 +1284,8 @@
     if (!uri.toString().endsWith(".dart")) return;
 
     Uint8List data = _fs.data[uri]!;
-    CompilationUnitEnd ast = getAST(data,
-        includeBody: true,
-        includeComments: false,
-        enableNonNullable: _isUriNnbd(uri));
+    CompilationUnitEnd ast =
+        getAST(data, includeBody: true, includeComments: false);
 
     _CompilationHelperClass helper = new _CompilationHelperClass(data);
 
@@ -1694,11 +1684,11 @@
     }
     Uint8List candidate = _replaceRange(data.replacements, data.originalData);
 
-    if (!_parsesWithoutError(candidate, _isUriNnbd(uri)) &&
-        _parsesWithoutError(data.originalData, _isUriNnbd(uri))) {
+    if (!_parsesWithoutError(candidate) &&
+        _parsesWithoutError(data.originalData)) {
       print("WARNING: Parser error after stuff at ${StackTrace.current}");
-      _parsesWithoutError(candidate, _isUriNnbd(uri));
-      _parsesWithoutError(data.originalData, _isUriNnbd(uri));
+      _parsesWithoutError(candidate);
+      _parsesWithoutError(data.originalData);
     }
 
     _fs.data[uri] = candidate;
@@ -1743,8 +1733,7 @@
     Uint8List candidate = builder.takeBytes();
     if (candidate.length == data.length) return;
 
-    if (uri.path.endsWith(".dart") &&
-        !_parsesWithoutError(candidate, _isUriNnbd(uri))) {
+    if (uri.path.endsWith(".dart") && !_parsesWithoutError(candidate)) {
       print("WARNING: Parser error after stuff at ${StackTrace.current}");
     }
 
@@ -1861,8 +1850,6 @@
 
   ScannerConfiguration _getScannerConfiguration(Version languageVersion) {
     return new ScannerConfiguration(
-        enableNonNullable:
-            languageVersion >= ExperimentalFlag.nonNullable.enabledVersion,
         enableTripleShift:
             languageVersion >= ExperimentalFlag.tripleShift.enabledVersion);
   }
@@ -1915,11 +1902,6 @@
     }
   }
 
-  bool _isUriNnbd(Uri uri, {bool crashOnFail = true}) {
-    return _getLanguageVersion(uri, crashOnFail: crashOnFail) >=
-        ExperimentalFlag.nonNullable.enabledVersion;
-  }
-
   Future<bool> _crashesOnCompile(Component initialComponent) async {
     IncrementalCompiler incrementalCompiler;
     _gotWantedError = false;
@@ -2134,13 +2116,11 @@
     return compilerContext;
   }
 
-  String _getFileAsStringContent(Uint8List rawBytes, bool nnbd) {
+  String _getFileAsStringContent(Uint8List rawBytes) {
     List<int> lineStarts = [];
 
-    Token firstToken = parser_suite.scanRawBytes(
-        rawBytes,
-        nnbd ? _scannerConfiguration : _scannerConfigurationNonNNBD,
-        lineStarts);
+    Token firstToken =
+        parser_suite.scanRawBytes(rawBytes, _scannerConfiguration, lineStarts);
 
     ParserTestListener parserTestListener = new ParserTestListener(false);
     Parser parser = new Parser(parserTestListener,
@@ -2151,9 +2131,9 @@
     return parsedString;
   }
 
-  bool _parsesWithoutError(Uint8List rawBytes, bool nnbd) {
-    Token firstToken = parser_suite.scanRawBytes(rawBytes,
-        nnbd ? _scannerConfiguration : _scannerConfigurationNonNNBD, null);
+  bool _parsesWithoutError(Uint8List rawBytes) {
+    Token firstToken =
+        parser_suite.scanRawBytes(rawBytes, _scannerConfiguration, null);
 
     ParserErrorListener parserErrorListener = new ParserErrorListener();
     Parser parser = new Parser(parserErrorListener,
@@ -2162,11 +2142,8 @@
     return !parserErrorListener.gotError;
   }
 
-  ScannerConfiguration _scannerConfiguration = new ScannerConfiguration(
-      enableTripleShift: true, enableNonNullable: true);
-
-  ScannerConfiguration _scannerConfigurationNonNNBD = new ScannerConfiguration(
-      enableTripleShift: true, enableNonNullable: false);
+  ScannerConfiguration _scannerConfiguration =
+      new ScannerConfiguration(enableTripleShift: true);
 
   List<int>? _dataCache;
   String? _dataCacheString;
diff --git a/pkg/front_end/test/lint_suite.dart b/pkg/front_end/test/lint_suite.dart
index 08f3375..34db7de 100644
--- a/pkg/front_end/test/lint_suite.dart
+++ b/pkg/front_end/test/lint_suite.dart
@@ -135,8 +135,7 @@
       Uint8List bytes = description.cache.rawBytes = f.readAsBytesSync();
       Utf8BytesScanner scanner = new Utf8BytesScanner(
         bytes,
-        configuration: const ScannerConfiguration(
-            enableNonNullable: true, enableTripleShift: true),
+        configuration: const ScannerConfiguration(enableTripleShift: true),
         includeComments: true,
         languageVersionChanged: (scanner, languageVersion) {
           // Nothing - but don't overwrite the previous settings.
diff --git a/pkg/front_end/test/parser/parser_ast_test.dart b/pkg/front_end/test/parser/parser_ast_test.dart
index 65f506f..d9a7af8 100644
--- a/pkg/front_end/test/parser/parser_ast_test.dart
+++ b/pkg/front_end/test/parser/parser_ast_test.dart
@@ -39,7 +39,6 @@
           data,
           includeBody: true,
           includeComments: true,
-          enableNonNullable: true,
           enableTripleShift: true,
         );
         splitIntoChunks(ast, data);
@@ -80,8 +79,8 @@
   File file = new File.fromUri(
       base.resolve("parser_ast_test_data/top_level_stuff.txt"));
   Uint8List data = file.readAsBytesSync();
-  CompilationUnitEnd ast = getAST(data,
-      includeBody: true, includeComments: true, enableNonNullable: false);
+  CompilationUnitEnd ast =
+      getAST(data, includeBody: true, includeComments: true);
   expect(2, ast.getImports().length);
   expect(2, ast.getExports().length);
 
@@ -134,8 +133,7 @@
   file = new File.fromUri(
       base.resolve("parser_ast_test_data/top_level_stuff_helper.txt"));
   data = file.readAsBytesSync();
-  ast = getAST(data,
-      includeBody: true, includeComments: true, enableNonNullable: false);
+  ast = getAST(data, includeBody: true, includeComments: true);
   foundChunks = splitIntoChunks(ast, data);
   expect(1, foundChunks.length);
   expect("part of 'top_level_stuff.txt';", foundChunks[0]);
@@ -143,8 +141,7 @@
   file =
       new File.fromUri(base.resolve("parser_ast_test_data/script_handle.txt"));
   data = file.readAsBytesSync();
-  ast = getAST(data,
-      includeBody: true, includeComments: true, enableNonNullable: false);
+  ast = getAST(data, includeBody: true, includeComments: true);
   foundChunks = splitIntoChunks(ast, data);
   expect(1, foundChunks.length);
   expect("#!/usr/bin/env dart -c", foundChunks[0]);
@@ -153,8 +150,8 @@
 void testClassStuff() {
   File file = new File.fromUri(base.resolve("parser_ast_test_data/class.txt"));
   Uint8List data = file.readAsBytesSync();
-  CompilationUnitEnd ast = getAST(data,
-      includeBody: true, includeComments: true, enableNonNullable: false);
+  CompilationUnitEnd ast =
+      getAST(data, includeBody: true, includeComments: true);
   List<TopLevelDeclarationEnd> classes = ast.getClasses();
   expect(2, classes.length);
 
@@ -234,8 +231,8 @@
 void testMixinStuff() {
   File file = new File.fromUri(base.resolve("parser_ast_test_data/mixin.txt"));
   Uint8List data = file.readAsBytesSync();
-  CompilationUnitEnd ast = getAST(data,
-      includeBody: true, includeComments: true, enableNonNullable: false);
+  CompilationUnitEnd ast =
+      getAST(data, includeBody: true, includeComments: true);
   List<TopLevelDeclarationEnd> mixins = ast.getMixinDeclarations();
   expect(mixins.length, 1);
 
diff --git a/pkg/front_end/test/parser_suite.dart b/pkg/front_end/test/parser_suite.dart
index 1cb1f0f..e5168ae 100644
--- a/pkg/front_end/test/parser_suite.dart
+++ b/pkg/front_end/test/parser_suite.dart
@@ -72,26 +72,15 @@
 }
 
 ScannerConfiguration scannerConfiguration = new ScannerConfiguration(
-    enableTripleShift: true,
-    enableNonNullable: true,
-    forAugmentationLibrary: false);
-
-ScannerConfiguration scannerConfigurationNonNNBD = new ScannerConfiguration(
-    enableTripleShift: true,
-    enableNonNullable: false,
-    forAugmentationLibrary: false);
+    enableTripleShift: true, forAugmentationLibrary: false);
 
 ScannerConfiguration scannerConfigurationNonTripleShift =
     new ScannerConfiguration(
-        enableTripleShift: false,
-        enableNonNullable: true,
-        forAugmentationLibrary: false);
+        enableTripleShift: false, forAugmentationLibrary: false);
 
 ScannerConfiguration scannerConfigurationAugmentation =
     new ScannerConfiguration(
-        enableTripleShift: true,
-        enableNonNullable: true,
-        forAugmentationLibrary: true);
+        enableTripleShift: true, forAugmentationLibrary: true);
 
 class Context extends ChainContext with MatchContext {
   @override
@@ -401,8 +390,8 @@
   ScannerConfiguration config;
 
   String firstDir = shortName.split("/")[0];
-  if (firstDir == "non-nnbd") {
-    config = scannerConfigurationNonNNBD;
+  if (firstDir == "also-nnbd") {
+    config = scannerConfigurationNonTripleShift;
   } else if (firstDir == "no-triple-shift") {
     config = scannerConfigurationNonTripleShift;
   } else if (firstDir == "augmentation") {
diff --git a/pkg/front_end/test/scanner_test.dart b/pkg/front_end/test/scanner_test.dart
index cea2784..862e2f9 100644
--- a/pkg/front_end/test/scanner_test.dart
+++ b/pkg/front_end/test/scanner_test.dart
@@ -588,13 +588,7 @@
   }
 
   void test_keyword_late() {
-    _assertKeywordToken("late",
-        configuration: ScannerConfiguration(enableNonNullable: true));
-  }
-
-  void test_keyword_late_old() {
-    _assertNotKeywordToken("late",
-        configuration: ScannerConfiguration(enableNonNullable: false));
+    _assertKeywordToken("late", configuration: ScannerConfiguration());
   }
 
   void test_keyword_library() {
@@ -642,13 +636,7 @@
   }
 
   void test_keyword_required() {
-    _assertKeywordToken("required",
-        configuration: ScannerConfiguration(enableNonNullable: true));
-  }
-
-  void test_keyword_required_disabled() {
-    _assertNotKeywordToken("required",
-        configuration: ScannerConfiguration(enableNonNullable: false));
+    _assertKeywordToken("required", configuration: ScannerConfiguration());
   }
 
   void test_keyword_rethrow() {
@@ -1444,27 +1432,6 @@
   }
 
   /**
-   * Assert that when scanned the given [source] contains a single identifier
-   * token with the same lexeme as the original source.
-   */
-  void _assertNotKeywordToken(String source,
-      {ScannerConfiguration? configuration}) {
-    Token token = _scan(source, configuration: configuration);
-    expect(token, isNotNull);
-    expect(token.type.isKeyword, false);
-    expect(token.offset, 0);
-    expect(token.length, source.length);
-    expect(token.lexeme, source);
-    token = _scan(" $source ", configuration: configuration);
-    expect(token, isNotNull);
-    expect(token.type.isKeyword, false);
-    expect(token.offset, 1);
-    expect(token.length, source.length);
-    expect(token.lexeme, source);
-    expect(token.next!.type, TokenType.EOF);
-  }
-
-  /**
    * Assert that the token scanned from the given [source] has the
    * [expectedType].
    */
diff --git a/pkg/front_end/test/testing/suite.dart b/pkg/front_end/test/testing/suite.dart
index bf85974..a38b1f7 100644
--- a/pkg/front_end/test/testing/suite.dart
+++ b/pkg/front_end/test/testing/suite.dart
@@ -1625,7 +1625,6 @@
     CompilationUnitEnd ast = getAST(bytes,
         includeBody: false,
         includeComments: true,
-        enableNonNullable: true,
         allowPatterns: allowPatterns);
     ast.accept(this);
 
diff --git a/pkg/front_end/test/textual_outline_suite.dart b/pkg/front_end/test/textual_outline_suite.dart
index 73a65fa..ffcfbf6 100644
--- a/pkg/front_end/test/textual_outline_suite.dart
+++ b/pkg/front_end/test/textual_outline_suite.dart
@@ -116,8 +116,6 @@
       String? result = textualOutline(
         bytes,
         new ScannerConfiguration(
-          enableNonNullable: isExperimentEnabled(ExperimentalFlag.nonNullable,
-              explicitExperimentalFlags: experimentalFlags),
           enableTripleShift: isExperimentEnabled(ExperimentalFlag.tripleShift,
               explicitExperimentalFlags: experimentalFlags),
         ),
diff --git a/pkg/front_end/test/utils/kernel_chain.dart b/pkg/front_end/test/utils/kernel_chain.dart
index 49acbb4..fb8ddaa 100644
--- a/pkg/front_end/test/utils/kernel_chain.dart
+++ b/pkg/front_end/test/utils/kernel_chain.dart
@@ -334,8 +334,7 @@
     Uint8List rawBytes = f.readAsBytesSync();
     Utf8BytesScanner scanner = new Utf8BytesScanner(
       rawBytes,
-      configuration: const ScannerConfiguration(
-          enableNonNullable: true, enableTripleShift: true),
+      configuration: const ScannerConfiguration(enableTripleShift: true),
       includeComments: true,
       languageVersionChanged: (scanner, languageVersion) {
         // Nothing - but don't overwrite the previous settings.
diff --git a/pkg/front_end/test/web_parser_git_test_helper.dart b/pkg/front_end/test/web_parser_git_test_helper.dart
index 3b5e4f6..66b3309 100644
--- a/pkg/front_end/test/web_parser_git_test_helper.dart
+++ b/pkg/front_end/test/web_parser_git_test_helper.dart
@@ -16,8 +16,8 @@
 }
 """;
 
-  ScannerConfiguration scannerConfiguration = new ScannerConfiguration(
-      enableNonNullable: true, enableTripleShift: true);
+  ScannerConfiguration scannerConfiguration =
+      new ScannerConfiguration(enableTripleShift: true);
 
   StringScanner scanner = new StringScanner(
     source,
diff --git a/pkg/front_end/tool/coverage_merger.dart b/pkg/front_end/tool/coverage_merger.dart
index 5012acf..14aa17b 100644
--- a/pkg/front_end/tool/coverage_merger.dart
+++ b/pkg/front_end/tool/coverage_merger.dart
@@ -267,7 +267,6 @@
   CompilationUnitEnd ast = getAST(
     rawBytes,
     includeComments: true,
-    enableNonNullable: true,
     enableTripleShift: true,
     allowPatterns: true,
     lineStarts: lineStarts,
diff --git a/pkg/front_end/tool/dart_doctest_impl.dart b/pkg/front_end/tool/dart_doctest_impl.dart
index b4dc667..a3f10fc 100644
--- a/pkg/front_end/tool/dart_doctest_impl.dart
+++ b/pkg/front_end/tool/dart_doctest_impl.dart
@@ -530,8 +530,8 @@
 }
 
 Token scanRawBytes(Uint8List rawBytes, {List<int>? lineStarts}) {
-  ScannerConfiguration scannerConfiguration = new ScannerConfiguration(
-      enableNonNullable: true, enableTripleShift: true);
+  ScannerConfiguration scannerConfiguration =
+      new ScannerConfiguration(enableTripleShift: true);
 
   Utf8BytesScanner scanner = new Utf8BytesScanner(
     rawBytes,
diff --git a/pkg/front_end/tool/duplicate_code_finder_experiment.dart b/pkg/front_end/tool/duplicate_code_finder_experiment.dart
index b28d915..519c311 100644
--- a/pkg/front_end/tool/duplicate_code_finder_experiment.dart
+++ b/pkg/front_end/tool/duplicate_code_finder_experiment.dart
@@ -329,9 +329,7 @@
 
 Token _scan(String data) {
   ScannerConfiguration scannerConfiguration = new ScannerConfiguration(
-      enableTripleShift: true,
-      enableNonNullable: true,
-      forAugmentationLibrary: false);
+      enableTripleShift: true, forAugmentationLibrary: false);
 
   StringScanner scanner =
       new StringScanner(data, configuration: scannerConfiguration);
diff --git a/pkg/front_end/tool/fuzz/minimizer.dart b/pkg/front_end/tool/fuzz/minimizer.dart
index da0b65d..ed477d6 100644
--- a/pkg/front_end/tool/fuzz/minimizer.dart
+++ b/pkg/front_end/tool/fuzz/minimizer.dart
@@ -33,7 +33,6 @@
   CompilationUnitEnd ast = getAST(
     rawBytes,
     includeComments: true,
-    enableNonNullable: true,
     enableTripleShift: true,
     allowPatterns: true,
   );
diff --git a/pkg/front_end/tool/parser_direct_ast/viewer.dart b/pkg/front_end/tool/parser_direct_ast/viewer.dart
index cac6d096..5c0bec5 100644
--- a/pkg/front_end/tool/parser_direct_ast/viewer.dart
+++ b/pkg/front_end/tool/parser_direct_ast/viewer.dart
@@ -19,7 +19,6 @@
   Uint8List bytes = new File.fromUri(uri).readAsBytesSync();
   ParserAstNode ast = getAST(
     bytes,
-    enableNonNullable: true,
     enableTripleShift: true,
     allowPatterns: true,
   );