diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java index bd02f00fc1f..44012511fea 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -129,7 +129,6 @@ public interface Errors { DiagnosticFactory0 CYCLIC_INHERITANCE_HIERARCHY = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 SUPERTYPE_NOT_INITIALIZED = DiagnosticFactory0.create(ERROR); - DiagnosticFactory0 SUPERTYPE_NOT_INITIALIZED_DEFAULT = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 DELEGATION_NOT_TO_TRAIT = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 SUPERTYPE_NOT_A_CLASS_OR_TRAIT = DiagnosticFactory0.create(ERROR); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java index 30421426fd0..9b8f6da5878 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java @@ -150,7 +150,6 @@ public class DefaultErrorMessages { MAP.put(PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT, "Projections are not allowed on type arguments of functions and properties"); MAP.put(SUPERTYPE_NOT_INITIALIZED, "This type has a constructor, and thus must be initialized here"); - MAP.put(SUPERTYPE_NOT_INITIALIZED_DEFAULT, "Constructor invocation should be explicitly specified"); MAP.put(NOTHING_TO_OVERRIDE, "''{0}'' overrides nothing", NAME); MAP.put(VIRTUAL_MEMBER_HIDDEN, "''{0}'' hides member of supertype ''{2}'' and needs ''override'' modifier", NAME, NAME, NAME); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java index 0f9a5883f22..9dab74d0616 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java @@ -246,18 +246,7 @@ public class BodyResolver { if (classDescriptor == null) return; if (descriptor.getKind() != ClassKind.TRAIT && !classDescriptor.getConstructors().isEmpty() && !ErrorUtils.isError(classDescriptor.getTypeConstructor()) && classDescriptor.getKind() != ClassKind.TRAIT) { - boolean hasConstructorWithoutParams = false; - for (ConstructorDescriptor constructor : classDescriptor.getConstructors()) { - if (constructor.getValueParameters().isEmpty()) { - hasConstructorWithoutParams = true; - } - } - if (!hasConstructorWithoutParams) { - trace.report(SUPERTYPE_NOT_INITIALIZED.on(specifier)); - } - else { - trace.report(SUPERTYPE_NOT_INITIALIZED_DEFAULT.on(specifier)); - } + trace.report(SUPERTYPE_NOT_INITIALIZED.on(specifier)); } } diff --git a/compiler/testData/diagnostics/tests/Constructors.kt b/compiler/testData/diagnostics/tests/Constructors.kt index 4e8420422c1..a3691edae82 100644 --- a/compiler/testData/diagnostics/tests/Constructors.kt +++ b/compiler/testData/diagnostics/tests/Constructors.kt @@ -1,11 +1,11 @@ open class NoC -class NoC1 : NoC +class NoC1 : NoC class WithC0() : NoC() -open class WithC1() : NoC -class NoC2 : WithC1 +open class WithC1() : NoC +class NoC2 : WithC1 class NoC3 : WithC1() -class WithC2() : WithC1 +class WithC2() : WithC1 class WithPC0() { } @@ -14,7 +14,7 @@ class WithPC1(a : Int) { } -class Foo() : WithPC0, this() { +class Foo() : WithPC0, this() { } diff --git a/compiler/testData/diagnostics/tests/SupertypeListChecks.kt b/compiler/testData/diagnostics/tests/SupertypeListChecks.kt index e6c0c487054..3b252bf16e7 100644 --- a/compiler/testData/diagnostics/tests/SupertypeListChecks.kt +++ b/compiler/testData/diagnostics/tests/SupertypeListChecks.kt @@ -38,12 +38,12 @@ trait Test6 : C1 {} class CTest1() : OC1() {} -class CTest2 : C2 {} +class CTest2 : C2 {} -class CTest3 : C2, C3 {} +class CTest3 : C2, C3 {} class CTest4 : T1 {} class CTest5 : T1, T1 {} -class CTest6 : C1 {} \ No newline at end of file +class CTest6 : C1 {} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/TraitSupertypeList.kt b/compiler/testData/diagnostics/tests/TraitSupertypeList.kt index d9dba99bdeb..518769eb384 100644 --- a/compiler/testData/diagnostics/tests/TraitSupertypeList.kt +++ b/compiler/testData/diagnostics/tests/TraitSupertypeList.kt @@ -6,5 +6,5 @@ trait Foo() : bar() trait Foo2 : bar, Foo { } -open class Foo1() : bar(), bar, Foo, Foo() {} -open class Foo12 : bar(), bar {} \ No newline at end of file +open class Foo1() : bar(), bar, Foo, Foo() {} +open class Foo12 : bar(), bar {} \ No newline at end of file diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeToConstructorInvocationFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeToConstructorInvocationFix.java index 1d41e9fdafa..058c6e6ced6 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeToConstructorInvocationFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeToConstructorInvocationFix.java @@ -21,12 +21,16 @@ import com.intellij.openapi.project.Project; import com.intellij.psi.PsiFile; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.descriptors.ClassDescriptor; +import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor; +import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; import org.jetbrains.jet.lang.diagnostics.Diagnostic; -import org.jetbrains.jet.lang.psi.JetClass; -import org.jetbrains.jet.lang.psi.JetDelegationSpecifier; -import org.jetbrains.jet.lang.psi.JetDelegatorToSuperClass; -import org.jetbrains.jet.lang.psi.JetPsiFactory; +import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lang.resolve.BindingContext; +import org.jetbrains.jet.lang.types.JetType; +import org.jetbrains.jet.lang.types.TypeUtils; import org.jetbrains.jet.plugin.JetBundle; +import org.jetbrains.jet.plugin.caches.resolve.KotlinCacheManager; import java.util.List; @@ -48,6 +52,24 @@ public class ChangeToConstructorInvocationFix extends JetIntentionAction() {} diff --git a/idea/testData/quickfix/supertypeInitialization/afterSupertypeNotInitializedEmptyConstructor.kt b/idea/testData/quickfix/supertypeInitialization/afterSupertypeNotInitializedEmptyConstructor.kt new file mode 100644 index 00000000000..991a201a427 --- /dev/null +++ b/idea/testData/quickfix/supertypeInitialization/afterSupertypeNotInitializedEmptyConstructor.kt @@ -0,0 +1,3 @@ +// "Change to constructor invocation" "true" +open class A() {} +class B() : A() {} diff --git a/idea/testData/quickfix/supertypeInitialization/beforeSupertypeNotInitialized.kt b/idea/testData/quickfix/supertypeInitialization/beforeSupertypeNotInitialized.kt new file mode 100644 index 00000000000..08f96ab5755 --- /dev/null +++ b/idea/testData/quickfix/supertypeInitialization/beforeSupertypeNotInitialized.kt @@ -0,0 +1,4 @@ +// "Change to constructor invocation" "false" +// ERROR: This type has a constructor, and thus must be initialized here +open class A(x : Int) {} +class B : A {} diff --git a/idea/testData/quickfix/supertypeInitialization/beforeSupertypeNotInitializedDefaultParameters.kt b/idea/testData/quickfix/supertypeInitialization/beforeSupertypeNotInitializedDefaultParameters.kt new file mode 100644 index 00000000000..612fdb9a691 --- /dev/null +++ b/idea/testData/quickfix/supertypeInitialization/beforeSupertypeNotInitializedDefaultParameters.kt @@ -0,0 +1,3 @@ +// "Change to constructor invocation" "true" +open class A(x : Int = 42, vararg y : Int) {} +class B() : A {} diff --git a/idea/testData/quickfix/supertypeInitialization/beforeSupertypeNotInitializedEmptyConstructor.kt b/idea/testData/quickfix/supertypeInitialization/beforeSupertypeNotInitializedEmptyConstructor.kt new file mode 100644 index 00000000000..8406cde8587 --- /dev/null +++ b/idea/testData/quickfix/supertypeInitialization/beforeSupertypeNotInitializedEmptyConstructor.kt @@ -0,0 +1,3 @@ +// "Change to constructor invocation" "true" +open class A() {} +class B() : A {} diff --git a/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java index 1433adfaaf3..89c900a81e7 100644 --- a/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java @@ -31,7 +31,7 @@ import org.jetbrains.jet.plugin.quickfix.AbstractQuickFixTest; /** This class is generated by {@link org.jetbrains.jet.generators.tests.GenerateTests}. DO NOT MODIFY MANUALLY */ @SuppressWarnings("all") @TestMetadata("idea/testData/quickfix") -@InnerTestClasses({QuickFixTestGenerated.Abstract.class, QuickFixTestGenerated.AddStarProjections.class, QuickFixTestGenerated.AutoImports.class, QuickFixTestGenerated.Expressions.class, QuickFixTestGenerated.Migration.class, QuickFixTestGenerated.Modifiers.class, QuickFixTestGenerated.Nullables.class, QuickFixTestGenerated.Override.class, QuickFixTestGenerated.TypeAddition.class, QuickFixTestGenerated.TypeImports.class, QuickFixTestGenerated.TypeProjection.class, QuickFixTestGenerated.UselessImports.class, QuickFixTestGenerated.Variables.class, QuickFixTestGenerated.When.class}) +@InnerTestClasses({QuickFixTestGenerated.Abstract.class, QuickFixTestGenerated.AddStarProjections.class, QuickFixTestGenerated.AutoImports.class, QuickFixTestGenerated.Expressions.class, QuickFixTestGenerated.Migration.class, QuickFixTestGenerated.Modifiers.class, QuickFixTestGenerated.Nullables.class, QuickFixTestGenerated.Override.class, QuickFixTestGenerated.SupertypeInitialization.class, QuickFixTestGenerated.TypeAddition.class, QuickFixTestGenerated.TypeImports.class, QuickFixTestGenerated.TypeProjection.class, QuickFixTestGenerated.UselessImports.class, QuickFixTestGenerated.Variables.class, QuickFixTestGenerated.When.class}) public class QuickFixTestGenerated extends AbstractQuickFixTest { public void testAllFilesPresentInQuickfix() throws Exception { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("idea/testData/quickfix"), Pattern.compile("^before(\\w+)\\.kt$"), true); @@ -646,6 +646,29 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { } + @TestMetadata("idea/testData/quickfix/supertypeInitialization") + public static class SupertypeInitialization extends AbstractQuickFixTest { + public void testAllFilesPresentInSupertypeInitialization() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("idea/testData/quickfix/supertypeInitialization"), Pattern.compile("^before(\\w+)\\.kt$"), true); + } + + @TestMetadata("beforeSupertypeNotInitialized.kt") + public void testSupertypeNotInitialized() throws Exception { + doTest("idea/testData/quickfix/supertypeInitialization/beforeSupertypeNotInitialized.kt"); + } + + @TestMetadata("beforeSupertypeNotInitializedDefaultParameters.kt") + public void testSupertypeNotInitializedDefaultParameters() throws Exception { + doTest("idea/testData/quickfix/supertypeInitialization/beforeSupertypeNotInitializedDefaultParameters.kt"); + } + + @TestMetadata("beforeSupertypeNotInitializedEmptyConstructor.kt") + public void testSupertypeNotInitializedEmptyConstructor() throws Exception { + doTest("idea/testData/quickfix/supertypeInitialization/beforeSupertypeNotInitializedEmptyConstructor.kt"); + } + + } + @TestMetadata("idea/testData/quickfix/typeAddition") public static class TypeAddition extends AbstractQuickFixTest { public void testAllFilesPresentInTypeAddition() throws Exception { @@ -937,6 +960,7 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { suite.addTest(Modifiers.innerSuite()); suite.addTest(Nullables.innerSuite()); suite.addTestSuite(Override.class); + suite.addTestSuite(SupertypeInitialization.class); suite.addTestSuite(TypeAddition.class); suite.addTestSuite(TypeImports.class); suite.addTestSuite(TypeProjection.class);