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;