[analyzer/cfe] Add an experiment flag for sealed class.

Have a separate flag from patterns, even though sealed families are to be shipped with patterns -- keep the work separate for now.

Change-Id: Ic3996b81d9a61f2a3b1e5137e7cc32ecc8bdec9e
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/267289
Reviewed-by: Paul Berry <paulberry@google.com>
Commit-Queue: Kallen Tu <kallentu@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Leaf Petersen <leafp@google.com>
Reviewed-by: Kevin Moore <kevmoo@google.com>
diff --git a/pkg/analyzer/lib/dart/analysis/features.dart b/pkg/analyzer/lib/dart/analysis/features.dart
index a73a8fb..310a84e 100644
--- a/pkg/analyzer/lib/dart/analysis/features.dart
+++ b/pkg/analyzer/lib/dart/analysis/features.dart
@@ -52,6 +52,9 @@
   /// Feature information for spread collections.
   static final spread_collections = ExperimentalFeatures.spread_collections;
 
+  // Feature information for sealed classes.
+  static final sealed_class = ExperimentalFeatures.sealed_class;
+
   /// Feature information for set literals.
   static final set_literals = ExperimentalFeatures.set_literals;
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 4c75ccb..3ea63b0 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -85,7 +85,7 @@
 /// TODO(scheglov) Clean up the list of implicitly analyzed files.
 class AnalysisDriver implements AnalysisDriverGeneric {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 247;
+  static const int DATA_VERSION = 248;
 
   /// The number of exception contexts allowed to write. Once this field is
   /// zero, we stop writing any new exception contexts in this process.
diff --git a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
index 7dcbc27..2b1bade 100644
--- a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
@@ -35,6 +35,7 @@
       ExperimentalFeatures.nonfunction_type_aliases,
   EnableString.patterns: ExperimentalFeatures.patterns,
   EnableString.records: ExperimentalFeatures.records,
+  EnableString.sealed_class: ExperimentalFeatures.sealed_class,
   EnableString.set_literals: ExperimentalFeatures.set_literals,
   EnableString.spread_collections: ExperimentalFeatures.spread_collections,
   EnableString.super_parameters: ExperimentalFeatures.super_parameters,
@@ -97,6 +98,9 @@
   /// String to enable the experiment "records"
   static const String records = 'records';
 
+  /// String to enable the experiment "sealed-class"
+  static const String sealed_class = 'sealed-class';
+
   /// String to enable the experiment "set-literals"
   static const String set_literals = 'set-literals';
 
@@ -290,8 +294,18 @@
     releaseVersion: null,
   );
 
-  static final set_literals = ExperimentalFeature(
+  static final sealed_class = ExperimentalFeature(
     index: 16,
+    enableString: EnableString.sealed_class,
+    isEnabledByDefault: IsEnabledByDefault.sealed_class,
+    isExpired: IsExpired.sealed_class,
+    documentation: 'Sealed class',
+    experimentalReleaseVersion: null,
+    releaseVersion: null,
+  );
+
+  static final set_literals = ExperimentalFeature(
+    index: 17,
     enableString: EnableString.set_literals,
     isEnabledByDefault: IsEnabledByDefault.set_literals,
     isExpired: IsExpired.set_literals,
@@ -301,7 +315,7 @@
   );
 
   static final spread_collections = ExperimentalFeature(
-    index: 17,
+    index: 18,
     enableString: EnableString.spread_collections,
     isEnabledByDefault: IsEnabledByDefault.spread_collections,
     isExpired: IsExpired.spread_collections,
@@ -311,7 +325,7 @@
   );
 
   static final super_parameters = ExperimentalFeature(
-    index: 18,
+    index: 19,
     enableString: EnableString.super_parameters,
     isEnabledByDefault: IsEnabledByDefault.super_parameters,
     isExpired: IsExpired.super_parameters,
@@ -321,7 +335,7 @@
   );
 
   static final test_experiment = ExperimentalFeature(
-    index: 19,
+    index: 20,
     enableString: EnableString.test_experiment,
     isEnabledByDefault: IsEnabledByDefault.test_experiment,
     isExpired: IsExpired.test_experiment,
@@ -332,7 +346,7 @@
   );
 
   static final triple_shift = ExperimentalFeature(
-    index: 20,
+    index: 21,
     enableString: EnableString.triple_shift,
     isEnabledByDefault: IsEnabledByDefault.triple_shift,
     isExpired: IsExpired.triple_shift,
@@ -342,7 +356,7 @@
   );
 
   static final unnamed_libraries = ExperimentalFeature(
-    index: 21,
+    index: 22,
     enableString: EnableString.unnamed_libraries,
     isEnabledByDefault: IsEnabledByDefault.unnamed_libraries,
     isExpired: IsExpired.unnamed_libraries,
@@ -352,7 +366,7 @@
   );
 
   static final value_class = ExperimentalFeature(
-    index: 22,
+    index: 23,
     enableString: EnableString.value_class,
     isEnabledByDefault: IsEnabledByDefault.value_class,
     isExpired: IsExpired.value_class,
@@ -362,7 +376,7 @@
   );
 
   static final variance = ExperimentalFeature(
-    index: 23,
+    index: 24,
     enableString: EnableString.variance,
     isEnabledByDefault: IsEnabledByDefault.variance,
     isExpired: IsExpired.variance,
@@ -372,7 +386,7 @@
   );
 
   static final views = ExperimentalFeature(
-    index: 24,
+    index: 25,
     enableString: EnableString.views,
     isEnabledByDefault: IsEnabledByDefault.views,
     isExpired: IsExpired.views,
@@ -433,6 +447,9 @@
   /// Default state of the experiment "records"
   static const bool records = false;
 
+  /// Default state of the experiment "sealed-class"
+  static const bool sealed_class = false;
+
   /// Default state of the experiment "set-literals"
   static const bool set_literals = true;
 
@@ -513,6 +530,9 @@
   /// Expiration status of the experiment "records"
   static const bool records = false;
 
+  /// Expiration status of the experiment "sealed-class"
+  static const bool sealed_class = false;
+
   /// Expiration status of the experiment "set-literals"
   static const bool set_literals = true;
 
@@ -598,6 +618,9 @@
   /// Current state for the flag "records"
   bool get records => isEnabled(ExperimentalFeatures.records);
 
+  /// Current state for the flag "sealed-class"
+  bool get sealed_class => isEnabled(ExperimentalFeatures.sealed_class);
+
   /// Current state for the flag "set-literals"
   bool get set_literals => isEnabled(ExperimentalFeatures.set_literals);
 
diff --git a/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart b/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
index 1a8690c..57c1792 100644
--- a/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
+++ b/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
@@ -187,6 +187,14 @@
       experimentEnabledVersion: const Version(2, 19),
       experimentReleasedVersion: const Version(2, 19));
 
+  static const ExperimentalFlag sealedClass = const ExperimentalFlag(
+      name: 'sealed-class',
+      isEnabledByDefault: false,
+      isExpired: false,
+      enabledVersion: const Version(2, 19),
+      experimentEnabledVersion: const Version(2, 19),
+      experimentReleasedVersion: const Version(2, 19));
+
   static const ExperimentalFlag setLiterals = const ExperimentalFlag(
       name: 'set-literals',
       isEnabledByDefault: true,
@@ -374,6 +382,10 @@
   GlobalFeature get records =>
       _records ??= _computeGlobalFeature(ExperimentalFlag.records);
 
+  GlobalFeature? _sealedClass;
+  GlobalFeature get sealedClass =>
+      _sealedClass ??= _computeGlobalFeature(ExperimentalFlag.sealedClass);
+
   GlobalFeature? _setLiterals;
   GlobalFeature get setLiterals =>
       _setLiterals ??= _computeGlobalFeature(ExperimentalFlag.setLiterals);
@@ -514,6 +526,11 @@
       _records ??= globalFeatures._computeLibraryFeature(
           ExperimentalFlag.records, canonicalUri, libraryVersion);
 
+  LibraryFeature? _sealedClass;
+  LibraryFeature get sealedClass =>
+      _sealedClass ??= globalFeatures._computeLibraryFeature(
+          ExperimentalFlag.sealedClass, canonicalUri, libraryVersion);
+
   LibraryFeature? _setLiterals;
   LibraryFeature get setLiterals =>
       _setLiterals ??= globalFeatures._computeLibraryFeature(
@@ -595,6 +612,8 @@
       return ExperimentalFlag.patterns;
     case "records":
       return ExperimentalFlag.records;
+    case "sealed-class":
+      return ExperimentalFlag.sealedClass;
     case "set-literals":
       return ExperimentalFlag.setLiterals;
     case "spread-collections":
@@ -648,6 +667,7 @@
       ExperimentalFlag.nonfunctionTypeAliases.isEnabledByDefault,
   ExperimentalFlag.patterns: ExperimentalFlag.patterns.isEnabledByDefault,
   ExperimentalFlag.records: ExperimentalFlag.records.isEnabledByDefault,
+  ExperimentalFlag.sealedClass: ExperimentalFlag.sealedClass.isEnabledByDefault,
   ExperimentalFlag.setLiterals: ExperimentalFlag.setLiterals.isEnabledByDefault,
   ExperimentalFlag.spreadCollections:
       ExperimentalFlag.spreadCollections.isEnabledByDefault,
diff --git a/tools/experimental_features.yaml b/tools/experimental_features.yaml
index b4f2525..84837ad 100644
--- a/tools/experimental_features.yaml
+++ b/tools/experimental_features.yaml
@@ -138,6 +138,9 @@
   views:
     help: "Views"
 
+  sealed-class:
+    help: "Sealed class"
+
 # Experiment flag only used for testing.
   test-experiment:
     help: >-