Fix crash when non-class is given as supertype

Before this CL this code would crash fasta:
```
class A extends Function() {}
```

Now it produces a compile time error instead:

```
t.dart:1:7: Error: Can't use a function type as supertype.
class A extends Function() {}
      ^
```

(technically it already issued it, but crashed before doing so).

Bug: #36824

Change-Id: Iaeb9dc8390d4a9ab7b473848c3311f08a4dbba6d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/101283
Commit-Queue: Jens Johansen <jensj@google.com>
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 28b8b90..09cd1c9 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -166,9 +166,16 @@
           fileUri);
       actualCls.supertype = null;
     }
+    if (actualCls.supertype == null && supertype is! KernelNamedTypeBuilder) {
+      supertype = null;
+    }
     mixedInType = checkSupertype(mixedInType);
     actualCls.mixedInType =
         mixedInType?.buildMixedInType(library, charOffset, fileUri);
+    if (actualCls.mixedInType == null &&
+        mixedInType is! KernelNamedTypeBuilder) {
+      mixedInType = null;
+    }
     actualCls.isMixinDeclaration = isMixinDeclaration;
     // TODO(ahe): If `cls.supertype` is null, and this isn't Object, report a
     // compile-time error.
@@ -305,7 +312,7 @@
 
   List<Declaration> computeDirectSupertypes(ClassBuilder objectClass) {
     final List<Declaration> result = <Declaration>[];
-    final KernelNamedTypeBuilder supertype = this.supertype;
+    final KernelTypeBuilder supertype = this.supertype;
     if (supertype != null) {
       result.add(supertype.declaration);
     } else if (objectClass != this) {
@@ -314,11 +321,11 @@
     final List<KernelTypeBuilder> interfaces = this.interfaces;
     if (interfaces != null) {
       for (int i = 0; i < interfaces.length; i++) {
-        KernelNamedTypeBuilder interface = interfaces[i];
+        KernelTypeBuilder interface = interfaces[i];
         result.add(interface.declaration);
       }
     }
-    final KernelNamedTypeBuilder mixedInType = this.mixedInType;
+    final KernelTypeBuilder mixedInType = this.mixedInType;
     if (mixedInType != null) {
       result.add(mixedInType.declaration);
     }