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(