[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;