Use modifiers to store some flags

Change-Id: I1848186917d5538266e4eb5d6a76e07435d2d871
Reviewed-on: https://dart-review.googlesource.com/c/85707
Commit-Queue: Peter von der Ahé <ahe@google.com>
Commit-Queue: Dmitry Stefantsov <dmitryas@google.com>
Auto-Submit: Peter von der Ahé <ahe@google.com>
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
diff --git a/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart b/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart
index 033904e..587a7df 100644
--- a/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart
@@ -25,13 +25,10 @@
 
   final String name;
 
-  /// True if this parameter is on the form `this.name`.
-  final bool hasThis;
-
   FormalParameterKind kind = FormalParameterKind.mandatory;
 
   FormalParameterBuilder(this.metadata, this.modifiers, this.type, this.name,
-      this.hasThis, LibraryBuilder compilationUnit, int charOffset)
+      LibraryBuilder compilationUnit, int charOffset)
       : super(compilationUnit, charOffset);
 
   String get debugName => "FormalParameterBuilder";
diff --git a/pkg/front_end/lib/src/fasta/builder/modifier_builder.dart b/pkg/front_end/lib/src/fasta/builder/modifier_builder.dart
index c229560..47e75a7 100644
--- a/pkg/front_end/lib/src/fasta/builder/modifier_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/modifier_builder.dart
@@ -11,6 +11,8 @@
         covariantMask,
         externalMask,
         finalMask,
+        hasInitializerMask,
+        initializingFormalMask,
         namedMixinApplicationMask,
         staticMask;
 
@@ -44,6 +46,10 @@
     return (modifiers & namedMixinApplicationMask) != 0;
   }
 
+  bool get hasInitializer => (modifiers & hasInitializerMask) != 0;
+
+  bool get isInitializingFormal => (modifiers & initializingFormalMask) != 0;
+
   bool get isClassMember => false;
 
   String get name;
diff --git a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
index aeb7fd1..e720b31 100644
--- a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
@@ -70,7 +70,7 @@
     if (formals == null) return parent;
     Map<String, Declaration> local = <String, Declaration>{};
     for (FormalParameterBuilder formal in formals) {
-      if (!isConstructor || !formal.hasThis) {
+      if (!isConstructor || !formal.isInitializingFormal) {
         local[formal.name] = formal;
       }
     }
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 7507a99..d08726b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -590,7 +590,7 @@
       }
       if (member.formals != null) {
         for (KernelFormalParameterBuilder formal in member.formals) {
-          if (formal.hasThis) {
+          if (formal.isInitializingFormal) {
             Initializer initializer;
             if (member.isExternal) {
               initializer = buildInvalidInitializer(
@@ -994,7 +994,7 @@
     for (int i = 0; i < parameters.positionalParameters.length; i++) {
       VariableDeclaration formal = parameters.positionalParameters[i];
       formals[i] = new KernelFormalParameterBuilder(
-          null, 0, null, formal.name, false, library, formal.fileOffset)
+          null, 0, null, formal.name, library, formal.fileOffset)
         ..declaration = formal;
     }
     enterLocalScope(
@@ -2612,7 +2612,7 @@
       }
     } else {
       parameter = new KernelFormalParameterBuilder(null, modifiers,
-          type?.builder, name?.name, false, library, offsetForToken(nameToken));
+          type?.builder, name?.name, library, offsetForToken(nameToken));
     }
     VariableDeclaration variable =
         parameter.build(library, functionNestingLevel);
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
index 7491a7c..ef82912 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
@@ -37,7 +37,13 @@
         templateDuplicatedDeclarationSyntheticCause,
         templateEnumConstantSameNameAsEnclosing;
 
-import '../modifier.dart' show constMask, finalMask, staticMask;
+import '../modifier.dart'
+    show
+        constMask,
+        finalMask,
+        hasInitializerMask,
+        initializingFormalMask,
+        staticMask;
 
 import '../source/source_class_builder.dart' show SourceClassBuilder;
 
@@ -126,10 +132,10 @@
     ///   String toString() => _name;
     /// }
 
-    members["index"] = new KernelFieldBuilder(
-        null, intType, "index", finalMask, parent, charOffset, null, true);
-    members["_name"] = new KernelFieldBuilder(
-        null, stringType, "_name", finalMask, parent, charOffset, null, true);
+    members["index"] = new KernelFieldBuilder(null, intType, "index",
+        finalMask | hasInitializerMask, parent, charOffset, null);
+    members["_name"] = new KernelFieldBuilder(null, stringType, "_name",
+        finalMask | hasInitializerMask, parent, charOffset, null);
     KernelConstructorBuilder constructorBuilder = new KernelConstructorBuilder(
         null,
         constMask,
@@ -137,10 +143,10 @@
         "",
         null,
         <FormalParameterBuilder>[
-          new KernelFormalParameterBuilder(
-              null, 0, intType, "index", true, parent, charOffset),
-          new KernelFormalParameterBuilder(
-              null, 0, stringType, "_name", true, parent, charOffset)
+          new KernelFormalParameterBuilder(null, initializingFormalMask,
+              intType, "index", parent, charOffset),
+          new KernelFormalParameterBuilder(null, initializingFormalMask,
+              stringType, "_name", parent, charOffset)
         ],
         parent,
         charOffset,
@@ -148,8 +154,14 @@
         charOffset,
         charEndOffset);
     constructors[""] = constructorBuilder;
-    KernelFieldBuilder valuesBuilder = new KernelFieldBuilder(null, listType,
-        "values", constMask | staticMask, parent, charOffset, null, true);
+    KernelFieldBuilder valuesBuilder = new KernelFieldBuilder(
+        null,
+        listType,
+        "values",
+        constMask | staticMask | hasInitializerMask,
+        parent,
+        charOffset,
+        null);
     members["values"] = valuesBuilder;
     KernelProcedureBuilder toStringBuilder = new KernelProcedureBuilder(
         null,
@@ -205,11 +217,10 @@
             metadata,
             selfType,
             name,
-            constMask | staticMask,
+            constMask | staticMask | hasInitializerMask,
             parent,
             enumConstantInfo.charOffset,
-            null,
-            true);
+            null);
         metadataCollector?.setDocumentationComment(
             fieldBuilder.target, documentationComment);
         members[name] = fieldBuilder..next = existing;
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart
index 18a8aee..8e962cd 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart
@@ -33,7 +33,6 @@
   final List<MetadataBuilder> metadata;
   final KernelTypeBuilder type;
   Token initializerTokenForInference;
-  final bool hasInitializer;
 
   KernelFieldBuilder(
       this.metadata,
@@ -42,8 +41,7 @@
       int modifiers,
       Declaration compilationUnit,
       int charOffset,
-      this.initializerTokenForInference,
-      this.hasInitializer)
+      this.initializerTokenForInference)
       : field = new ShadowField(null, type == null,
             fileUri: compilationUnit?.fileUri)
           ..fileOffset = charOffset,
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_formal_parameter_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_formal_parameter_builder.dart
index f7b56a8..999f15e 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_formal_parameter_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_formal_parameter_builder.dart
@@ -6,7 +6,7 @@
 
 import 'package:kernel/ast.dart' show VariableDeclaration;
 
-import '../modifier.dart' show finalMask;
+import '../modifier.dart' show finalMask, initializingFormalMask;
 
 import 'kernel_builder.dart'
     show
@@ -27,11 +27,9 @@
       int modifiers,
       KernelTypeBuilder type,
       String name,
-      bool hasThis,
       KernelLibraryBuilder compilationUnit,
       int charOffset)
-      : super(metadata, modifiers, type, name, hasThis, compilationUnit,
-            charOffset);
+      : super(metadata, modifiers, type, name, compilationUnit, charOffset);
 
   VariableDeclaration get target => declaration;
 
@@ -42,7 +40,7 @@
           type: type?.build(library),
           isFinal: isFinal,
           isConst: isConst,
-          isFieldFormal: hasThis,
+          isFieldFormal: isInitializingFormal,
           isCovariant: isCovariant)
         ..fileOffset = charOffset;
     }
@@ -52,18 +50,23 @@
   KernelFormalParameterBuilder clone(List<TypeBuilder> newTypes) {
     // TODO(dmitryas):  It's not clear how [metadata] is used currently, and
     // how it should be cloned.  Consider cloning it instead of reusing it.
-    return new KernelFormalParameterBuilder(metadata, modifiers,
-        type?.clone(newTypes), name, hasThis, parent, charOffset)
+    return new KernelFormalParameterBuilder(
+        metadata, modifiers, type?.clone(newTypes), name, parent, charOffset)
       ..kind = kind;
   }
 
   @override
   FormalParameterBuilder forFormalParameterInitializerScope() {
     assert(declaration != null);
-    return !hasThis
+    return !isInitializingFormal
         ? this
-        : (new KernelFormalParameterBuilder(metadata, modifiers | finalMask,
-            type, name, hasThis, parent, charOffset)
+        : (new KernelFormalParameterBuilder(
+            metadata,
+            modifiers | finalMask | initializingFormalMask,
+            type,
+            name,
+            null,
+            charOffset)
           ..declaration = declaration);
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
index 9cae333..f2ec7bc 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
@@ -91,6 +91,8 @@
 import '../modifier.dart'
     show
         abstractMask,
+        hasInitializerMask,
+        initializingFormalMask,
         mixinDeclarationMask,
         namedMixinApplicationMask,
         staticMask;
@@ -592,11 +594,14 @@
       int charOffset,
       Token initializerTokenForInference,
       bool hasInitializer) {
-    var builder = new KernelFieldBuilder(metadata, type, name, modifiers, this,
-        charOffset, initializerTokenForInference, hasInitializer);
-    addBuilder(name, builder, charOffset);
+    if (hasInitializer) {
+      modifiers |= hasInitializerMask;
+    }
+    KernelFieldBuilder field = new KernelFieldBuilder(metadata, type, name,
+        modifiers, this, charOffset, initializerTokenForInference);
+    addBuilder(name, field, charOffset);
     loader.target.metadataCollector
-        ?.setDocumentationComment(builder.target, documentationComment);
+        ?.setDocumentationComment(field.target, documentationComment);
   }
 
   void addConstructor(
@@ -815,8 +820,12 @@
       String name,
       bool hasThis,
       int charOffset) {
-    return new KernelFormalParameterBuilder(
-        metadata, modifiers, type, name, hasThis, this, charOffset);
+    if (hasThis) {
+      modifiers |= initializingFormalMask;
+    }
+    KernelFormalParameterBuilder formal = new KernelFormalParameterBuilder(
+        metadata, modifiers, type, name, this, charOffset);
+    return formal;
   }
 
   KernelTypeVariableBuilder addTypeVariable(
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
index 96ed4c1..5bf9349 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
@@ -453,7 +453,7 @@
   bool get isEligibleForTopLevelInference {
     if (formals != null) {
       for (var formal in formals) {
-        if (formal.type == null && formal.hasThis) return true;
+        if (formal.type == null && formal.isInitializingFormal) return true;
       }
     }
     return false;
@@ -472,7 +472,7 @@
     }
     if (!library.disableTypeInference && isEligibleForTopLevelInference) {
       for (KernelFormalParameterBuilder formal in formals) {
-        if (formal.type == null && formal.hasThis) {
+        if (formal.type == null && formal.isInitializingFormal) {
           formal.declaration.type = null;
         }
       }
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
index 704126d..eae7bf1 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
@@ -124,7 +124,6 @@
               formal.modifiers,
               parameterType,
               formal.name,
-              formal.hasThis,
               formal.parent,
               formal.charOffset);
           changed = true;
diff --git a/pkg/front_end/lib/src/fasta/modifier.dart b/pkg/front_end/lib/src/fasta/modifier.dart
index 52f7017..4b7ed12 100644
--- a/pkg/front_end/lib/src/fasta/modifier.dart
+++ b/pkg/front_end/lib/src/fasta/modifier.dart
@@ -36,6 +36,12 @@
 /// keyword.
 const int mixinDeclarationMask = namedMixinApplicationMask << 1;
 
+/// Not a modifier, used by fields to track if they have an initializer.
+const int hasInitializerMask = mixinDeclarationMask << 1;
+
+/// Not a modifier, used by formal parameters to track if they are initializing.
+const int initializingFormalMask = hasInitializerMask << 1;
+
 /// Not a real modifier, and by setting it to zero, it is automatically ignored
 /// by [Modifier.validate] below.
 const int varMask = 0;