[cfe] Add flags for new experimental features

Add flags for extension-methods, non-nullable, and triple-shift.

Change-Id: I42d2afbe1b3353a18da8cdfec1fded3ad6694e3a
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/103620
Auto-Submit: Kevin Millikin <kmillikin@google.com>
Reviewed-by: Aske Simon Christensen <askesc@google.com>
Commit-Queue: Kevin Millikin <kmillikin@google.com>
diff --git a/pkg/front_end/lib/src/api_prototype/experimental_flags.dart b/pkg/front_end/lib/src/api_prototype/experimental_flags.dart
index d0615fd..f91b17d 100644
--- a/pkg/front_end/lib/src/api_prototype/experimental_flags.dart
+++ b/pkg/front_end/lib/src/api_prototype/experimental_flags.dart
@@ -7,8 +7,11 @@
 enum ExperimentalFlag {
   constantUpdate2018,
   controlFlowCollections,
+  extensionMethods,
+  nonNullable,
   setLiterals,
   spreadCollections,
+  tripleShift,
 }
 
 ExperimentalFlag parseExperimentalFlag(String flag) {
@@ -17,10 +20,16 @@
       return ExperimentalFlag.constantUpdate2018;
     case "control-flow-collections":
       return ExperimentalFlag.controlFlowCollections;
+    case "extension-methods":
+      return ExperimentalFlag.extensionMethods;
+    case "non-nullable":
+      return ExperimentalFlag.nonNullable;
     case "set-literals":
       return ExperimentalFlag.setLiterals;
     case "spread-collections":
       return ExperimentalFlag.spreadCollections;
+    case "triple-shift":
+      return ExperimentalFlag.tripleShift;
   }
   return null;
 }
@@ -28,6 +37,9 @@
 const Map<ExperimentalFlag, bool> defaultExperimentalFlags = {
   ExperimentalFlag.constantUpdate2018: false,
   ExperimentalFlag.controlFlowCollections: true,
+  ExperimentalFlag.extensionMethods: false,
+  ExperimentalFlag.nonNullable: false,
   ExperimentalFlag.setLiterals: true,
   ExperimentalFlag.spreadCollections: true,
+  ExperimentalFlag.tripleShift: false,
 };
diff --git a/pkg/front_end/lib/src/base/processed_options.dart b/pkg/front_end/lib/src/base/processed_options.dart
index 3746481..a3e6cbe 100644
--- a/pkg/front_end/lib/src/base/processed_options.dart
+++ b/pkg/front_end/lib/src/base/processed_options.dart
@@ -316,7 +316,6 @@
     assert(defaultExperimentalFlags.containsKey(flag),
         "No default value for $flag.");
     // TODO(askesc): Determine default flag value from specification file.
-    if (flag == ExperimentalFlag.setLiterals) return true;
     return _raw.experimentalFlags[flag] ?? defaultExperimentalFlags[flag];
   }
 
diff --git a/pkg/front_end/lib/src/fasta/target_implementation.dart b/pkg/front_end/lib/src/fasta/target_implementation.dart
index 6e82a7d..2ca6f77 100644
--- a/pkg/front_end/lib/src/fasta/target_implementation.dart
+++ b/pkg/front_end/lib/src/fasta/target_implementation.dart
@@ -50,18 +50,27 @@
 
   bool enableConstantUpdate2018;
   bool enableControlFlowCollections;
+  bool enableExtensionMethods;
+  bool enableNonNullable;
   bool enableSetLiterals;
   bool enableSpreadCollections;
+  bool enableTripleShift;
 
   TargetImplementation(Ticker ticker, this.uriTranslator, this.backendTarget)
       : enableConstantUpdate2018 = CompilerContext.current.options
             .isExperimentEnabled(ExperimentalFlag.constantUpdate2018),
         enableControlFlowCollections = CompilerContext.current.options
             .isExperimentEnabled(ExperimentalFlag.controlFlowCollections),
+        enableExtensionMethods = CompilerContext.current.options
+            .isExperimentEnabled(ExperimentalFlag.extensionMethods),
+        enableNonNullable = CompilerContext.current.options
+            .isExperimentEnabled(ExperimentalFlag.nonNullable),
         enableSetLiterals = CompilerContext.current.options
             .isExperimentEnabled(ExperimentalFlag.setLiterals),
         enableSpreadCollections = CompilerContext.current.options
             .isExperimentEnabled(ExperimentalFlag.spreadCollections),
+        enableTripleShift = CompilerContext.current.options
+            .isExperimentEnabled(ExperimentalFlag.tripleShift),
         super(ticker);
 
   /// Creates a [LibraryBuilder] corresponding to [uri], if one doesn't exist