diff --git a/idea/src/org/jetbrains/jet/plugin/actions/JetChangeFunctionSignatureAction.java b/idea/src/org/jetbrains/jet/plugin/actions/JetChangeFunctionSignatureAction.java index 4c80322ddad..325cab085f1 100644 --- a/idea/src/org/jetbrains/jet/plugin/actions/JetChangeFunctionSignatureAction.java +++ b/idea/src/org/jetbrains/jet/plugin/actions/JetChangeFunctionSignatureAction.java @@ -28,12 +28,13 @@ import com.intellij.psi.PsiDocumentManager; import com.intellij.util.PlatformIcons; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; -import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.psi.JetNamedFunction; import org.jetbrains.jet.lang.psi.JetPsiFactory; +import org.jetbrains.jet.lang.psi.JetTypeReference; import org.jetbrains.jet.plugin.JetBundle; -import org.jetbrains.jet.plugin.codeInsight.CodeInsightUtils; import org.jetbrains.jet.plugin.codeInsight.ShortenReferences; +import org.jetbrains.jet.renderer.DescriptorRenderer; +import org.jetbrains.jet.renderer.DescriptorRendererBuilder; import javax.swing.*; import java.util.ArrayList; @@ -47,6 +48,12 @@ import static org.jetbrains.jet.lang.psi.PsiPackage.JetPsiFactory; * Based on {@link JetAddImportAction} */ public class JetChangeFunctionSignatureAction implements QuestionAction { + public static final DescriptorRenderer SIGNATURE_RENDERER = new DescriptorRendererBuilder() + .setWithDefinedIn(false) + .setModifiers(DescriptorRenderer.Modifier.OVERRIDE) + .setShortNames(true) + .setOverrideRenderingPolicy(DescriptorRenderer.OverrideRenderingPolicy.RENDER_OVERRIDE) + .setUnitReturnType(false).build(); private final Project project; private final Editor editor; @@ -113,46 +120,32 @@ public class JetChangeFunctionSignatureAction implements QuestionAction { @NotNull @Override public String getTextFor(FunctionDescriptor aValue) { - return CodeInsightUtils.createFunctionSignatureStringFromDescriptor( - aValue, - /* shortTypeNames = */ true); + return SIGNATURE_RENDERER.render(aValue); } }; } - private static void changeSignature(final JetNamedFunction element, Project project, FunctionDescriptor signature) { - final String signatureString = CodeInsightUtils.createFunctionSignatureStringFromDescriptor( - signature, - /* shortTypeNames = */ false); + private static void changeSignature(final JetNamedFunction function, Project project, FunctionDescriptor patternDescriptor) { + final String signatureString = DescriptorRenderer.SOURCE_CODE.render(patternDescriptor); PsiDocumentManager.getInstance(project).commitAllDocuments(); - final JetPsiFactory psiFactory = JetPsiFactory(element); + final JetPsiFactory psiFactory = JetPsiFactory(project); CommandProcessor.getInstance().executeCommand(project, new Runnable() { @Override public void run() { ApplicationManager.getApplication().runWriteAction(new Runnable() { @Override public void run() { - JetExpression bodyExpression = element.getBodyExpression(); - JetNamedFunction newElement; + JetNamedFunction patternFunction = psiFactory.createFunction(signatureString); - if (bodyExpression != null) { - if (element.hasBlockBody()) { - newElement = psiFactory.createFunction(signatureString + "{}"); - } - else { - newElement = psiFactory.createFunction(signatureString + "= \"dummy\""); - } - JetExpression newBodyExpression = newElement.getBodyExpression(); - assert newBodyExpression != null; - newBodyExpression.replace(bodyExpression); + JetTypeReference newTypeRef = function.setReturnTypeRef(patternFunction.getReturnTypeRef()); + if (newTypeRef != null) { + ShortenReferences.INSTANCE$.process(newTypeRef); } - else { - newElement = psiFactory.createFunction(signatureString); - } - newElement = (JetNamedFunction) element.replace(newElement); - ShortenReferences.INSTANCE$.process(newElement); + + function.getValueParameterList().replace(patternFunction.getValueParameterList()); + ShortenReferences.INSTANCE$.process(function.getValueParameterList()); } }); } diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeMemberFunctionSignatureFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeMemberFunctionSignatureFix.java index 4af0a388638..e926ba5ee20 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeMemberFunctionSignatureFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeMemberFunctionSignatureFix.java @@ -43,7 +43,6 @@ import org.jetbrains.jet.lang.types.checker.JetTypeChecker; import org.jetbrains.jet.plugin.JetBundle; import org.jetbrains.jet.plugin.actions.JetChangeFunctionSignatureAction; import org.jetbrains.jet.plugin.caches.resolve.ResolvePackage; -import org.jetbrains.jet.plugin.codeInsight.CodeInsightUtils; import java.util.*; @@ -68,17 +67,14 @@ public class ChangeMemberFunctionSignatureFix extends JetHintAction computePossibleSignatures(JetNamedFunction functionElement) { + private static List computePossibleSignatures(@NotNull JetNamedFunction functionElement) { + if (functionElement.getValueParameterList() == null) { // we won't be able to modify its signature + return Collections.emptyList(); + } + BindingContext context = ResolvePackage.getBindingContext(functionElement); FunctionDescriptor functionDescriptor = context.get(BindingContext.FUNCTION, functionElement); if (functionDescriptor == null) return Lists.newArrayList(); @@ -116,7 +116,7 @@ public class ChangeMemberFunctionSignatureFix extends JetHintActionoverride fun f(a: Int) {} +} diff --git a/idea/testData/quickfix/override/nothingToOverride/afterOverrideJavaMethod.kt b/idea/testData/quickfix/override/nothingToOverride/afterOverrideJavaMethod.kt index 8ff6a3be928..7a3b543ad65 100644 --- a/idea/testData/quickfix/override/nothingToOverride/afterOverrideJavaMethod.kt +++ b/idea/testData/quickfix/override/nothingToOverride/afterOverrideJavaMethod.kt @@ -1,6 +1,6 @@ -// "Change function signature to 'protected override fun next(p0: Int): Int'" "true" +// "Change function signature to 'override fun next(p0: Int): Int'" "true" import java.util.Random class MyRandom : Random() { - protected override fun next(p0: Int): Int = 4 + override fun next(p0: Int): Int = 4 } \ No newline at end of file diff --git a/idea/testData/quickfix/override/nothingToOverride/beforeAddParameterPreserveVisibility.kt b/idea/testData/quickfix/override/nothingToOverride/beforeAddParameterPreserveVisibility.kt index a1e1e4146e7..1f80caabb67 100644 --- a/idea/testData/quickfix/override/nothingToOverride/beforeAddParameterPreserveVisibility.kt +++ b/idea/testData/quickfix/override/nothingToOverride/beforeAddParameterPreserveVisibility.kt @@ -1,4 +1,4 @@ -// "Change function signature to 'public override fun f(a: Int)'" "true" +// "Change function signature to 'override fun f(a: Int)'" "true" trait A { fun f(a: Int) } diff --git a/idea/testData/quickfix/override/nothingToOverride/beforeDoNotLooseAnnotations.kt b/idea/testData/quickfix/override/nothingToOverride/beforeDoNotLooseAnnotations.kt new file mode 100644 index 00000000000..8fd9e633409 --- /dev/null +++ b/idea/testData/quickfix/override/nothingToOverride/beforeDoNotLooseAnnotations.kt @@ -0,0 +1,10 @@ +// "Change function signature to 'override fun f(a: Int)'" "true" +annotation class annon + +open class A { + open fun f(a: Int) {} +} + +class B : A(){ + annon override fun f(a: String) {} +} diff --git a/idea/testData/quickfix/override/nothingToOverride/beforeOverrideJavaMethod.kt b/idea/testData/quickfix/override/nothingToOverride/beforeOverrideJavaMethod.kt index a16bc538fa9..8477dbcfde1 100644 --- a/idea/testData/quickfix/override/nothingToOverride/beforeOverrideJavaMethod.kt +++ b/idea/testData/quickfix/override/nothingToOverride/beforeOverrideJavaMethod.kt @@ -1,4 +1,4 @@ -// "Change function signature to 'protected override fun next(p0: Int): Int'" "true" +// "Change function signature to 'override fun next(p0: Int): Int'" "true" import java.util.Random class MyRandom : Random() { diff --git a/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java index 60589040d5a..cb5a43c6e9a 100644 --- a/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java @@ -2219,6 +2219,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("beforeDoNotLooseAnnotations.kt") + public void testDoNotLooseAnnotations() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/override/nothingToOverride/beforeDoNotLooseAnnotations.kt"); + doTest(fileName); + } + @TestMetadata("beforeNoOpenSuperFunction.kt") public void testNoOpenSuperFunction() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/override/nothingToOverride/beforeNoOpenSuperFunction.kt");