[parser] Change NullValue usage

This gets rid of (what is described in commented code as)
InstantiatedTypeWithArgumentsTest, Subtype1TestCacheLookup, BoolTest.

Running this through the benchmarker like this:

```
out/ReleaseX64/dart-sdk/bin/dart pkg/front_end/tool/benchmarker.dart \
  --snapshot=pkg/analysis_server/bin/server.aot.1 \
  --snapshot=pkg/analysis_server/bin/server.aot.2 \
  --arguments="--disable-file-byte-store" \
  --arguments="--train-using" \
  --arguments="pkg/front_end/lib/"
```

(there `server.aot.1` is without this CL and `server.aot.2` is with)
I get:

```
msec task-clock:u: -0.9614% +/- 0.3557% (-78.23 +/- 28.95) (8136.80 -> 8058.57)
cycles:u: -1.0257% +/- 0.3626% (-348283560.66 +/- 123129577.69) (33955507948.94 -> 33607224388.28)
instructions:u: -1.0595% +/- 0.0662% (-479117043.74 +/- 29935955.93) (45220681554.68 -> 44741564510.94)
seconds time elapsed: -0.9548% +/- 0.3540% (-0.08 +/- 0.03) (8.15 -> 8.07)
seconds user: -1.0649% +/- 0.4031% (-0.08 +/- 0.03) (7.80 -> 7.72)
Scavenge(   new space) goes from 130 to 129
Notice combined GC time goes from 2613 ms to 2608 ms (notice only 1 run each).
```

`StackImpl.pop` as reported by `perf report --no-children` goes from
0.81% to 0.34% (and I'm unsure why the apparent change seen as a whole
is quite a bit bigger).

Change-Id: Ife36da11215e0c8aa706d945f0ee5018ad03ab91
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/432340
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Jens Johansen <jensj@google.com>
diff --git a/pkg/_fe_analyzer_shared/lib/src/metadata/parser.dart b/pkg/_fe_analyzer_shared/lib/src/metadata/parser.dart
index 2ba16bf..995ab18 100644
--- a/pkg/_fe_analyzer_shared/lib/src/metadata/parser.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/metadata/parser.dart
@@ -1279,13 +1279,15 @@
   }
 }
 
-enum _NullValues implements NullValue<Object> {
-  Arguments,
-  Expression,
-  FunctionTypeParameters,
-  Identifier,
-  TypeAnnotation,
-  TypeAnnotations,
+class _NullValues {
+  static const NullValue Arguments = const NullValue("Argument");
+  static const NullValue Expression = const NullValue("Expression");
+  static const NullValue FunctionTypeParameters = const NullValue(
+    "FunctionTypeParameter",
+  );
+  static const NullValue Identifier = const NullValue("Identifier");
+  static const NullValue TypeAnnotation = const NullValue("TypeAnnotation");
+  static const NullValue TypeAnnotations = const NullValue("TypeAnnotations");
 }
 
 final Argument _dummyArgument = new PositionalArgument(
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart
index 39bf0b2..c818239 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart
@@ -34,60 +34,87 @@
 /// `NullValues.Expression` is pushed on the stack instead of `null` and when
 /// popping the entry `NullValues.Expression` is passed show how `null` is
 /// represented.
-enum NullValues implements NullValue<Object> {
-  Arguments,
-  As,
-  AwaitToken,
-  Block,
-  BreakTarget,
-  CascadeReceiver,
-  Combinators,
-  Comments,
-  ConditionalUris,
-  ConditionallySelectedImport,
-  ConstructorInitializerSeparator,
-  ConstructorInitializers,
-  ConstructorReference,
-  ConstructorReferenceContinuationAfterTypeArguments,
-  ContinueTarget,
-  Deferred,
-  DocumentationComment,
-  EnumConstantInfo,
-  Expression,
-  ExtendsClause,
-  FieldInitializer,
-  FormalParameters,
-  FunctionBody,
-  FunctionBodyAsyncToken,
-  FunctionBodyStarToken,
-  HideClause,
-  Identifier,
-  IdentifierList,
-  Initializers,
-  Labels,
-  Metadata,
-  Modifiers,
-  Name,
-  NominalVariable,
-  NominalParameters,
-  OperatorList,
-  ParameterDefaultValue,
-  Pattern,
-  PatternList,
-  Prefix,
-  RecordTypeFieldList,
-  ShowClause,
-  StringLiteral,
-  StructuralParameters,
-  Token,
-  Type,
-  TypeArguments,
-  TypeBuilder,
-  TypeBuilderList,
-  TypeList,
-  VarFinalOrConstToken,
-  VariableDeclarationList,
-  WithClause,
+class NullValues {
+  static const NullValue Arguments = const NullValue("Arguments");
+  static const NullValue As = const NullValue("As");
+  static const NullValue AwaitToken = const NullValue("AwaitToken");
+  static const NullValue Block = const NullValue("Block");
+  static const NullValue BreakTarget = const NullValue("BreakTarget");
+  static const NullValue CascadeReceiver = const NullValue("CascadeReceiver");
+  static const NullValue Combinators = const NullValue("Combinators");
+  static const NullValue Comments = const NullValue("Comments");
+  static const NullValue ConditionalUris = const NullValue("ConditionalUris");
+  static const NullValue ConditionallySelectedImport = const NullValue(
+    "ConditionallySelectedImport",
+  );
+  static const NullValue ConstructorInitializerSeparator = const NullValue(
+    "ConstructorInitializerSeparator",
+  );
+  static const NullValue ConstructorInitializers = const NullValue(
+    "ConstructorInitializers",
+  );
+  static const NullValue ConstructorReference = const NullValue(
+    "ConstructorReference",
+  );
+  static const NullValue ConstructorReferenceContinuationAfterTypeArguments =
+      const NullValue("ConstructorReferenceContinuationAfterTypeArguments");
+  static const NullValue ContinueTarget = const NullValue("ContinueTarget");
+  static const NullValue Deferred = const NullValue("Deferred");
+  static const NullValue DocumentationComment = const NullValue(
+    "DocumentationComment",
+  );
+  static const NullValue EnumConstantInfo = const NullValue("EnumConstantInfo");
+  static const NullValue Expression = const NullValue("Expression");
+  static const NullValue ExtendsClause = const NullValue("ExtendsClause");
+  static const NullValue FieldInitializer = const NullValue("FieldInitializer");
+  static const NullValue FormalParameters = const NullValue("FormalParameters");
+  static const NullValue FunctionBody = const NullValue("FunctionBody");
+  static const NullValue FunctionBodyAsyncToken = const NullValue(
+    "FunctionBodyAsyncToken",
+  );
+  static const NullValue FunctionBodyStarToken = const NullValue(
+    "FunctionBodyStarToken",
+  );
+  static const NullValue HideClause = const NullValue("HideClause");
+  static const NullValue Identifier = const NullValue("Identifier");
+  static const NullValue IdentifierList = const NullValue("IdentifierList");
+  static const NullValue Initializers = const NullValue("Initializers");
+  static const NullValue Labels = const NullValue("Labels");
+  static const NullValue Metadata = const NullValue("Metadata");
+  static const NullValue Modifiers = const NullValue("Modifiers");
+  static const NullValue Name = const NullValue("Name");
+  static const NullValue NominalVariable = const NullValue("NominalVariable");
+  static const NullValue NominalParameters = const NullValue(
+    "NominalParameters",
+  );
+  static const NullValue OperatorList = const NullValue("OperatorList");
+  static const NullValue ParameterDefaultValue = const NullValue(
+    "ParameterDefaultValue",
+  );
+  static const NullValue Pattern = const NullValue("Pattern");
+  static const NullValue PatternList = const NullValue("PatternList");
+  static const NullValue Prefix = const NullValue("Prefix");
+  static const NullValue RecordTypeFieldList = const NullValue(
+    "RecordTypeFieldList",
+  );
+  static const NullValue ShowClause = const NullValue("ShowClause");
+  static const NullValue StringLiteral = const NullValue("StringLiteral");
+  static const NullValue StructuralParameters = const NullValue(
+    "StructuralParameters",
+  );
+  static const NullValue Token = const NullValue("Token");
+  static const NullValue Type = const NullValue("Type");
+  static const NullValue TypeArguments = const NullValue("TypeArguments");
+  static const NullValue TypeBuilder = const NullValue("TypeBuilder");
+  static const NullValue TypeBuilderList = const NullValue("TypeBuilderList");
+  static const NullValue TypeList = const NullValue("TypeList");
+  static const NullValue VarFinalOrConstToken = const NullValue(
+    "VarFinalOrConstToken",
+  );
+  static const NullValue VariableDeclarationList = const NullValue(
+    "VariableDeclarationList",
+  );
+  static const NullValue WithClause = const NullValue("WithClause");
 }
 
 abstract class StackListener extends Listener with StackChecker {
diff --git a/pkg/_fe_analyzer_shared/lib/src/util/null_value.dart b/pkg/_fe_analyzer_shared/lib/src/util/null_value.dart
index b0a571b..78b5052 100644
--- a/pkg/_fe_analyzer_shared/lib/src/util/null_value.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/util/null_value.dart
@@ -9,8 +9,9 @@
 /// `NullValues.Expression` is pushed on the stack instead of `null` and when
 /// popping the entry `NullValues.Expression` is passed show how `null` is
 /// represented.
-class NullValue<T> {
-  const NullValue();
+final class NullValue {
+  final String T;
+  const NullValue(this.T);
 
   @override
   String toString() => "NullValue<$T>";
diff --git a/pkg/_fe_analyzer_shared/lib/src/util/value_kind.dart b/pkg/_fe_analyzer_shared/lib/src/util/value_kind.dart
index c142577..8634419a 100644
--- a/pkg/_fe_analyzer_shared/lib/src/util/value_kind.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/util/value_kind.dart
@@ -22,8 +22,7 @@
 /// A [ValueKind] for a particular type [T], optionally with a recognized
 /// [NullValue].
 class SingleValueKind<T> implements ValueKind {
-  // TODO(johnniwinther): Type this as `NullValue<T>?`.
-  final NullValue<Object>? nullValue;
+  final NullValue? nullValue;
 
   const SingleValueKind([this.nullValue]);
 
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 40e1793..285b5d4 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -1884,7 +1884,7 @@
     var implementsClause =
         pop(NullValues.IdentifierList) as ImplementsClauseImpl?;
     var representation =
-        pop(const NullValue<RepresentationDeclarationImpl>())
+        pop(const NullValue("RepresentationDeclarationImpl"))
             as RepresentationDeclarationImpl?;
     var constKeyword = pop() as Token?;
 
@@ -3164,7 +3164,7 @@
       fieldName = parser.rewriter.insertSyntheticIdentifier(typeNameToken);
     }
 
-    push(constKeyword ?? const NullValue<Token>());
+    push(constKeyword ?? const NullValue("Token"));
 
     push(
       RepresentationDeclarationImpl(
@@ -5418,9 +5418,9 @@
 
   @override
   void handleNoPrimaryConstructor(Token token, Token? constKeyword) {
-    push(constKeyword ?? const NullValue<Token>());
+    push(constKeyword ?? const NullValue("Token"));
 
-    push(const NullValue<RepresentationDeclarationImpl>());
+    push(const NullValue("RepresentationDeclarationImpl"));
   }
 
   @override
diff --git a/pkg/front_end/lib/src/type_inference/stack_values.dart b/pkg/front_end/lib/src/type_inference/stack_values.dart
index df39835..03e8e0d 100644
--- a/pkg/front_end/lib/src/type_inference/stack_values.dart
+++ b/pkg/front_end/lib/src/type_inference/stack_values.dart
@@ -7,14 +7,10 @@
 import 'package:kernel/ast.dart' as type;
 
 class NullValues {
-  static const NullValue<type.Expression> Expression =
-      const NullValue<type.Expression>();
-  static const NullValue<type.MapLiteralEntry> MapLiteralEntry =
-      const NullValue<type.MapLiteralEntry>();
-  static const NullValue<type.Pattern> Pattern =
-      const NullValue<type.Pattern>();
-  static const NullValue<type.Statement> Statement =
-      const NullValue<type.Statement>();
+  static const NullValue Expression = const NullValue("Expression");
+  static const NullValue MapLiteralEntry = const NullValue("MapLiteralEntry");
+  static const NullValue Pattern = const NullValue("Pattern");
+  static const NullValue Statement = const NullValue("Statement");
 }
 
 class ValueKinds {