diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiFactory.kt b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiFactory.kt index 60cbd6c9464..8927eeebe1d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiFactory.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiFactory.kt @@ -332,6 +332,10 @@ public class JetPsiFactory(private val project: Project) { return createArgumentWithName(null, argumentExpression) } + public fun createDelegatorToSuperCall(text: String): JetDelegatorToSuperCall { + return createClass("class A: $text").getDelegationSpecifiers().first() as JetDelegatorToSuperCall + } + public inner class IfChainBuilder() { private val sb = StringBuilder() private var first = true diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignatureUsageProcessor.java b/idea/src/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignatureUsageProcessor.java index 7545b6db481..4bb043e9ace 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignatureUsageProcessor.java +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignatureUsageProcessor.java @@ -42,10 +42,7 @@ import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.plugin.caches.resolve.ResolvePackage; -import org.jetbrains.jet.plugin.refactoring.changeSignature.usages.JetFunctionCallUsage; -import org.jetbrains.jet.plugin.refactoring.changeSignature.usages.JetFunctionDefinitionUsage; -import org.jetbrains.jet.plugin.refactoring.changeSignature.usages.JetParameterUsage; -import org.jetbrains.jet.plugin.refactoring.changeSignature.usages.JetUsageInfo; +import org.jetbrains.jet.plugin.refactoring.changeSignature.usages.*; import org.jetbrains.jet.renderer.DescriptorRenderer; import java.util.List; @@ -123,6 +120,14 @@ public class JetChangeSignatureUsageProcessor implements ChangeSignatureUsagePro } } } + + if (functionPsi instanceof JetClass && ((JetClass) functionPsi).isEnum()) { + for (JetDeclaration declaration : ((JetClass) functionPsi).getDeclarations()) { + if (declaration instanceof JetEnumEntry && ((JetEnumEntry) declaration).getDelegationSpecifierList() == null) { + result.add(new JetEnumEntryWithoutSuperCallUsage((JetEnumEntry) declaration)); + } + } + } } @Override diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/changeSignature/usages/JetEnumEntryWithoutSuperCallUsage.kt b/idea/src/org/jetbrains/jet/plugin/refactoring/changeSignature/usages/JetEnumEntryWithoutSuperCallUsage.kt new file mode 100644 index 00000000000..f0d89fffcc7 --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/changeSignature/usages/JetEnumEntryWithoutSuperCallUsage.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2010-2013 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.plugin.refactoring.changeSignature.usages + +import org.jetbrains.jet.lang.psi.JetEnumEntry +import org.jetbrains.jet.plugin.refactoring.changeSignature.JetChangeInfo +import org.jetbrains.jet.lang.psi.JetPsiFactory +import org.jetbrains.jet.lang.psi.psiUtil.getParentByType +import org.jetbrains.jet.lang.psi.JetClass +import org.jetbrains.jet.lang.psi.JetDelegatorToSuperCall + +public class JetEnumEntryWithoutSuperCallUsage(enumEntry: JetEnumEntry) : JetUsageInfo(enumEntry) { + override fun processUsage(changeInfo: JetChangeInfo, element: JetEnumEntry): Boolean { + if (changeInfo.getNewParameters().size > 0) { + val psiFactory = JetPsiFactory(element) + + val enumClass = element.getParentByType(javaClass(), true)!! + val delegatorToSuperCall = element.addAfter( + psiFactory.createDelegatorToSuperCall("${enumClass.getName()}()"), + element.getNameAsDeclaration() + ) as JetDelegatorToSuperCall + element.addBefore(psiFactory.createColon(), delegatorToSuperCall) + + return JetFunctionCallUsage(delegatorToSuperCall, enumClass, false).processUsage(changeInfo, delegatorToSuperCall) + } + + return true + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/parameter/afterInPropertyInitializerInEnumClass.kt b/idea/testData/quickfix/createFromUsage/createVariable/parameter/afterInPropertyInitializerInEnumClass.kt index 078151ffa34..6658c0b9639 100644 --- a/idea/testData/quickfix/createFromUsage/createVariable/parameter/afterInPropertyInitializerInEnumClass.kt +++ b/idea/testData/quickfix/createFromUsage/createVariable/parameter/afterInPropertyInitializerInEnumClass.kt @@ -1,12 +1,12 @@ // "Create parameter 'foo'" "true" -// ERROR: Missing delegation specifier 'E' -// ERROR: Missing delegation specifier 'E' -// ERROR: Missing delegation specifier 'E' +// ERROR: No value passed for parameter foo +// ERROR: No value passed for parameter foo +// ERROR: No value passed for parameter foo enum class E(foo: Int) { - A - B - C + A : E() + B : E() + C : E() val t: Int = foo } \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/parameter/afterInPropertyInitializerInEnumEntry.kt b/idea/testData/quickfix/createFromUsage/createVariable/parameter/afterInPropertyInitializerInEnumEntry.kt index b113bf5c28a..29222a924b4 100644 --- a/idea/testData/quickfix/createFromUsage/createVariable/parameter/afterInPropertyInitializerInEnumEntry.kt +++ b/idea/testData/quickfix/createFromUsage/createVariable/parameter/afterInPropertyInitializerInEnumEntry.kt @@ -1,12 +1,12 @@ // "Create parameter 'foo'" "true" -// ERROR: Missing delegation specifier 'E' -// ERROR: Missing delegation specifier 'E' -// ERROR: Missing delegation specifier 'E' +// ERROR: No value passed for parameter foo +// ERROR: No value passed for parameter foo +// ERROR: No value passed for parameter foo enum class E(val foo: Int) { - A - B { + A : E() + B : E() { val t: Int = foo } - C + C : E() } \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/parameter/beforeInPropertyInitializerInEnumClass.kt b/idea/testData/quickfix/createFromUsage/createVariable/parameter/beforeInPropertyInitializerInEnumClass.kt index 6ddbd8885af..f19a1c53617 100644 --- a/idea/testData/quickfix/createFromUsage/createVariable/parameter/beforeInPropertyInitializerInEnumClass.kt +++ b/idea/testData/quickfix/createFromUsage/createVariable/parameter/beforeInPropertyInitializerInEnumClass.kt @@ -1,7 +1,7 @@ // "Create parameter 'foo'" "true" -// ERROR: Missing delegation specifier 'E' -// ERROR: Missing delegation specifier 'E' -// ERROR: Missing delegation specifier 'E' +// ERROR: No value passed for parameter foo +// ERROR: No value passed for parameter foo +// ERROR: No value passed for parameter foo enum class E { A diff --git a/idea/testData/quickfix/createFromUsage/createVariable/parameter/beforeInPropertyInitializerInEnumEntry.kt b/idea/testData/quickfix/createFromUsage/createVariable/parameter/beforeInPropertyInitializerInEnumEntry.kt index 56f3c053a28..1ed916b1595 100644 --- a/idea/testData/quickfix/createFromUsage/createVariable/parameter/beforeInPropertyInitializerInEnumEntry.kt +++ b/idea/testData/quickfix/createFromUsage/createVariable/parameter/beforeInPropertyInitializerInEnumEntry.kt @@ -1,7 +1,7 @@ // "Create parameter 'foo'" "true" -// ERROR: Missing delegation specifier 'E' -// ERROR: Missing delegation specifier 'E' -// ERROR: Missing delegation specifier 'E' +// ERROR: No value passed for parameter foo +// ERROR: No value passed for parameter foo +// ERROR: No value passed for parameter foo enum class E { A diff --git a/idea/testData/refactoring/changeSignature/EnumEntriesWithoutSuperCallsAfter.kt b/idea/testData/refactoring/changeSignature/EnumEntriesWithoutSuperCallsAfter.kt new file mode 100644 index 00000000000..37104f82419 --- /dev/null +++ b/idea/testData/refactoring/changeSignature/EnumEntriesWithoutSuperCallsAfter.kt @@ -0,0 +1,4 @@ +enum class E(n: Int) { + A : E(1) + B : E(1) +} \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignature/EnumEntriesWithoutSuperCallsBefore.kt b/idea/testData/refactoring/changeSignature/EnumEntriesWithoutSuperCallsBefore.kt new file mode 100644 index 00000000000..76bf0650929 --- /dev/null +++ b/idea/testData/refactoring/changeSignature/EnumEntriesWithoutSuperCallsBefore.kt @@ -0,0 +1,4 @@ +enum class E { + A + B +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignatureTest.java b/idea/tests/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignatureTest.java index d2bd19c2577..3fce6c1ec66 100644 --- a/idea/tests/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignatureTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignatureTest.java @@ -287,6 +287,14 @@ public class JetChangeSignatureTest extends KotlinCodeInsightTestCase { doTest(changeInfo); } + public void testEnumEntriesWithoutSuperCalls() throws Exception { + JetChangeInfo changeInfo = getChangeInfo(); + JetParameterInfo newParameter = new JetParameterInfo("n", KotlinBuiltIns.getInstance().getIntType()); + newParameter.setDefaultValueText("1"); + changeInfo.addParameter(newParameter); + doTest(changeInfo); + } + @NotNull @Override protected String getTestDataPath() {