From 4ac2e29d287469e88c0a6b8266415578f61db327 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Fri, 8 May 2015 20:39:18 +0300 Subject: [PATCH] Fixed error type case --- .../kotlin/idea/quickfix/SuperClassNotInitialized.kt | 3 +-- .../supertypeInitialization/baseConstructorError.kt | 7 +++++++ .../kotlin/idea/quickfix/QuickFixTestGenerated.java | 6 ++++++ 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 idea/testData/quickfix/supertypeInitialization/baseConstructorError.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/SuperClassNotInitialized.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/SuperClassNotInitialized.kt index a0ba81ec0ed..3e89009b430 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/SuperClassNotInitialized.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/SuperClassNotInitialized.kt @@ -58,7 +58,7 @@ public object SuperClassNotInitialized : JetIntentionActionsFactory() { val constructorToUse = constructors.singleOrNull() ?: constructors.singleOrNull { it.isPrimary() } //TODO: should we select it automatically in this case? //TODO: multiple - if (constructorToUse != null && constructorToUse.getValueParameters().isNotEmpty()) { + if (constructorToUse != null && constructorToUse.getValueParameters().isNotEmpty() && constructorToUse.getValueParameters().none { it.getType().isError() }) { val superType = classDescriptor.getTypeConstructor().getSupertypes().first { it.getConstructor().getDeclarationDescriptor() == superClass } val typeArgsMap = superClass.getTypeConstructor().getParameters().zip(superType.getArguments()).toMap() val substitutor = TypeUtils.makeSubstitutorForTypeParametersMap(typeArgsMap) @@ -108,7 +108,6 @@ public object SuperClassNotInitialized : JetIntentionActionsFactory() { if (!superParameters.isEmpty()) { val parameterList = classDeclaration.getOrCreatePrimaryConstructorParameterList() for (parameter in superParameters) { - //TODO: what if type is error? val name = renderer.renderName(parameter.getName()) val parameterText = name + ":" + renderer.renderType(parameter.getType()) val newParameter = parameterList.addParameter(factory.createParameter(parameterText)) diff --git a/idea/testData/quickfix/supertypeInitialization/baseConstructorError.kt b/idea/testData/quickfix/supertypeInitialization/baseConstructorError.kt new file mode 100644 index 00000000000..1641a347c8c --- /dev/null +++ b/idea/testData/quickfix/supertypeInitialization/baseConstructorError.kt @@ -0,0 +1,7 @@ +// "class org.jetbrains.kotlin.idea.quickfix.SuperClassNotInitialized$AddParametersFix" "false" +// ACTION: Change to constructor invocation +// ERROR: Unresolved reference: XXX +// ERROR: This type has a constructor, and thus must be initialized here +open class Base(p1: XXX) + +class C : Base \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index d353e3ea223..177ea353aa2 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -3993,6 +3993,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/supertypeInitialization"), Pattern.compile("^(\\w+)\\.kt$"), true); } + @TestMetadata("baseConstructorError.kt") + public void testBaseConstructorError() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/supertypeInitialization/baseConstructorError.kt"); + doTest(fileName); + } + @TestMetadata("createConstructor.kt") public void testCreateConstructor() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/supertypeInitialization/createConstructor.kt");