Produce fix when super constructor does not exist

Change-Id: I8186b42a938a3ad814e624ba5b378c130422209f
Reviewed-on: https://dart-review.googlesource.com/70080
Reviewed-by: Paul Berry <paulberry@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index 05dc705..0d9e95b 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -331,6 +331,10 @@
     if (errorCode ==
         CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT) {
       await _addFix_createConstructorSuperImplicit();
+      // TODO(brianwilkerson) The following was added because fasta produces
+      // NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT in places where analyzer produced
+      // NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT
+      await _addFix_createConstructorSuperExplicit();
     }
     if (errorCode ==
         CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT) {
@@ -1528,7 +1532,8 @@
   Future<void> _addFix_createConstructorSuperImplicit() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    ClassDeclaration targetClassNode = node.parent as ClassDeclaration;
+    ClassDeclaration targetClassNode =
+        node.getAncestor((parent) => parent is ClassDeclaration);
     ClassElement targetClassElement = targetClassNode.declaredElement;
     InterfaceType superType = targetClassElement.supertype;
     String targetClassName = targetClassElement.name;
diff --git a/pkg/analysis_server/test/services/correction/fix_test.dart b/pkg/analysis_server/test/services/correction/fix_test.dart
index 30d179a..03a61da 100644
--- a/pkg/analysis_server/test/services/correction/fix_test.dart
+++ b/pkg/analysis_server/test/services/correction/fix_test.dart
@@ -7308,31 +7308,6 @@
 
   @failingTest
   @override
-  test_createConstructorSuperExplicit() =>
-      super.test_createConstructorSuperExplicit();
-
-  @failingTest
-  @override
-  test_createConstructorSuperExplicit_hasInitializers() =>
-      super.test_createConstructorSuperExplicit_hasInitializers();
-
-  @failingTest
-  @override
-  test_createConstructorSuperExplicit_named() =>
-      super.test_createConstructorSuperExplicit_named();
-
-  @failingTest
-  @override
-  test_createConstructorSuperExplicit_named_private() =>
-      super.test_createConstructorSuperExplicit_named_private();
-
-  @failingTest
-  @override
-  test_createConstructorSuperExplicit_typeArgument() =>
-      super.test_createConstructorSuperExplicit_typeArgument();
-
-  @failingTest
-  @override
   test_createConstructorSuperImplicit() =>
       super.test_createConstructorSuperImplicit();
 
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 3beea59..5837189 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -1012,12 +1012,16 @@
                   builder.charOffset, const <TypeParameter>[]) !=
               null) {
         String superclass = classBuilder.supertype.fullNameForErrors;
+        int length = constructor.name.name.length;
+        if (length == 0) {
+          length = (constructor.parent as Class).name.length;
+        }
         initializer = buildInvalidInitializer(
             buildCompileTimeError(
                 fasta.templateSuperclassHasNoDefaultConstructor
                     .withArguments(superclass),
                 builder.charOffset,
-                constructor.name.name.length),
+                length),
             builder.charOffset);
       } else {
         initializer = buildSuperInitializer(