[kernel] Make Procedure.kind final
Change-Id: I1a97c483bd0110061f4a60d26d28ab625dbbc00b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/169220
Reviewed-by: Jens Johansen <jensj@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
diff --git a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
index 537e376..deb42c7 100644
--- a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
@@ -264,7 +264,8 @@
charEndOffset,
toStringReference,
null,
- AsyncMarker.Sync);
+ AsyncMarker.Sync,
+ /* isExtensionInstanceMember = */ false);
members["toString"] = toStringBuilder;
String className = name;
if (enumConstantInfos != null) {
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 1b81273..a4c221b 100644
--- a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
@@ -82,6 +82,8 @@
@override
Procedure get actualProcedure => _procedure;
+ final bool isExtensionInstanceMember;
+
ProcedureBuilderImpl(
List<MetadataBuilder> metadata,
int modifiers,
@@ -96,8 +98,10 @@
this.charOpenParenOffset,
int charEndOffset,
Procedure referenceFrom,
+ this.isExtensionInstanceMember,
[String nativeMethodName])
- : _procedure = new Procedure(null, kind, null,
+ : _procedure = new Procedure(
+ null, isExtensionInstanceMember ? ProcedureKind.Method : kind, null,
fileUri: compilationUnit.fileUri,
reference: referenceFrom?.reference)
..startFileOffset = startCharOffset
@@ -228,6 +232,7 @@
Procedure referenceFrom,
this._tearOffReferenceFrom,
AsyncMarker asyncModifier,
+ bool isExtensionInstanceMember,
[String nativeMethodName])
: super(
metadata,
@@ -243,6 +248,7 @@
charOpenParenOffset,
charEndOffset,
referenceFrom,
+ isExtensionInstanceMember,
nativeMethodName) {
this.asyncModifier = asyncModifier;
}
@@ -366,7 +372,7 @@
_procedure.isExtensionMember = true;
_procedure.isStatic = true;
if (isExtensionInstanceMember) {
- _procedure.kind = ProcedureKind.Method;
+ assert(_procedure.kind == ProcedureKind.Method);
}
_procedure.name = new Name(
createProcedureName(true, !isExtensionInstanceMember, kind,
@@ -674,6 +680,7 @@
charOpenParenOffset,
charEndOffset,
referenceFrom,
+ /* isExtensionInstanceMember = */ false,
nativeMethodName);
@override
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index 6a9bacf..471859f 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -862,7 +862,8 @@
endToken.charOffset,
nativeMethodName,
asyncModifier,
- isTopLevel: true);
+ isTopLevel: true,
+ isExtensionInstanceMember: false);
nativeMethodName = null;
}
@@ -950,42 +951,42 @@
@override
void endClassMethod(Token getOrSet, Token beginToken, Token beginParam,
Token beginInitializers, Token endToken) {
- _endClassMethod(
- getOrSet, beginToken, beginParam, beginInitializers, endToken, false);
+ _endClassMethod(getOrSet, beginToken, beginParam, beginInitializers,
+ endToken, _MethodKind.classMethod);
}
void endClassConstructor(Token getOrSet, Token beginToken, Token beginParam,
Token beginInitializers, Token endToken) {
- _endClassMethod(
- getOrSet, beginToken, beginParam, beginInitializers, endToken, true);
+ _endClassMethod(getOrSet, beginToken, beginParam, beginInitializers,
+ endToken, _MethodKind.classConstructor);
}
void endMixinMethod(Token getOrSet, Token beginToken, Token beginParam,
Token beginInitializers, Token endToken) {
- _endClassMethod(
- getOrSet, beginToken, beginParam, beginInitializers, endToken, false);
+ _endClassMethod(getOrSet, beginToken, beginParam, beginInitializers,
+ endToken, _MethodKind.mixinMethod);
}
void endExtensionMethod(Token getOrSet, Token beginToken, Token beginParam,
Token beginInitializers, Token endToken) {
- _endClassMethod(
- getOrSet, beginToken, beginParam, beginInitializers, endToken, false);
+ _endClassMethod(getOrSet, beginToken, beginParam, beginInitializers,
+ endToken, _MethodKind.extensionMethod);
}
void endMixinConstructor(Token getOrSet, Token beginToken, Token beginParam,
Token beginInitializers, Token endToken) {
- _endClassMethod(
- getOrSet, beginToken, beginParam, beginInitializers, endToken, true);
+ _endClassMethod(getOrSet, beginToken, beginParam, beginInitializers,
+ endToken, _MethodKind.mixinConstructor);
}
void endExtensionConstructor(Token getOrSet, Token beginToken,
Token beginParam, Token beginInitializers, Token endToken) {
- _endClassMethod(
- getOrSet, beginToken, beginParam, beginInitializers, endToken, true);
+ _endClassMethod(getOrSet, beginToken, beginParam, beginInitializers,
+ endToken, _MethodKind.extensionConstructor);
}
void _endClassMethod(Token getOrSet, Token beginToken, Token beginParam,
- Token beginInitializers, Token endToken, bool isConstructor) {
+ Token beginInitializers, Token endToken, _MethodKind methodKind) {
assert(checkState(beginToken, [ValueKinds.MethodBody]));
debugEvent("Method");
MethodBody bodyKind = pop();
@@ -1113,12 +1114,23 @@
return;
}
- String constructorName = isConstructor
- ? (libraryBuilder.computeAndValidateConstructorName(name, charOffset) ??
- name)
- : null;
+ String constructorName;
+ switch (methodKind) {
+ case _MethodKind.classConstructor:
+ case _MethodKind.mixinConstructor:
+ case _MethodKind.extensionConstructor:
+ constructorName = libraryBuilder.computeAndValidateConstructorName(
+ name, charOffset) ??
+ name;
+ break;
+ case _MethodKind.classMethod:
+ case _MethodKind.mixinMethod:
+ case _MethodKind.extensionMethod:
+ break;
+ }
+ bool isStatic = (modifiers & staticMask) != 0;
if (constructorName == null &&
- (modifiers & staticMask) == 0 &&
+ !isStatic &&
libraryBuilder.currentTypeParameterScopeBuilder.kind ==
TypeParameterScopeKind.extensionDeclaration) {
TypeParameterScopeBuilder extension =
@@ -1216,7 +1228,9 @@
endToken.charOffset,
nativeMethodName,
asyncModifier,
- isTopLevel: false);
+ isTopLevel: false,
+ isExtensionInstanceMember:
+ methodKind == _MethodKind.extensionMethod && !isStatic);
}
nativeMethodName = null;
inConstructor = false;
@@ -2184,3 +2198,12 @@
// printEvent('OutlineBuilder: $name');
}
}
+
+enum _MethodKind {
+ classConstructor,
+ classMethod,
+ mixinConstructor,
+ mixinMethod,
+ extensionConstructor,
+ extensionMethod,
+}
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 4454553..badb049 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -2282,7 +2282,11 @@
int charEndOffset,
String nativeMethodName,
AsyncMarker asyncModifier,
- {bool isTopLevel}) {
+ {bool isTopLevel,
+ bool isExtensionInstanceMember}) {
+ assert(isTopLevel != null);
+ assert(isExtensionInstanceMember != null);
+
MetadataCollector metadataCollector = loader.target.metadataCollector;
if (returnType == null) {
if (kind == ProcedureKind.Operator &&
@@ -2357,6 +2361,7 @@
referenceFrom,
tearOffReferenceFrom,
asyncModifier,
+ isExtensionInstanceMember,
nativeMethodName);
metadataCollector?.setDocumentationComment(
procedureBuilder.procedure, documentationComment);
@@ -2443,6 +2448,7 @@
referenceFrom,
null,
asyncModifier,
+ /* isExtensionInstanceMember = */ false,
nativeMethodName);
}
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 7dfb32e..a8a4a63 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -474,7 +474,8 @@
-1,
null,
null,
- AsyncMarker.Sync)
+ AsyncMarker.Sync,
+ /* isExtensionInstanceMember = */ false)
..parent = parent;
BodyBuilder listener = dietListener.createListener(
builder, dietListener.memberScope,
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index fadd9a2..09193dc 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -2122,7 +2122,7 @@
/// set).
int startFileOffset = TreeNode.noOffset;
- ProcedureKind kind;
+ final ProcedureKind kind;
int flags = 0;
// function is null if and only if abstract, external.
FunctionNode function;
@@ -2203,7 +2203,8 @@
this.forwardingStubSuperTargetReference,
this.forwardingStubInterfaceTargetReference,
this.memberSignatureOriginReference})
- : super(name, fileUri, reference) {
+ : assert(kind != null),
+ super(name, fileUri, reference) {
function?.parent = this;
this.isAbstract = isAbstract;
this.isStatic = isStatic;
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 7292d92..8153e05 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -1371,15 +1371,17 @@
if (alwaysCreateNewNamedNodes) {
node = null;
}
- if (node == null) {
- node = new Procedure(null, null, null, reference: reference);
- }
var fileUri = readUriReference();
var startFileOffset = readOffset();
var fileOffset = readOffset();
var fileEndOffset = readOffset();
int kindIndex = readByte();
var kind = ProcedureKind.values[kindIndex];
+ if (node == null) {
+ node = new Procedure(null, kind, null, reference: reference);
+ } else {
+ assert(node.kind == kind);
+ }
var flags = readUInt();
var name = readName();
var annotations = readAnnotationList(node);
@@ -1403,7 +1405,6 @@
node.startFileOffset = startFileOffset;
node.fileOffset = fileOffset;
node.fileEndOffset = fileEndOffset;
- node.kind = kind;
node.flags = flags;
node.name = name;
node.fileUri = fileUri;