From f9a2b09a4e97e1ed0caeebba1f9fb96b9ac4d6b4 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Mon, 11 Nov 2013 17:57:03 +0400 Subject: [PATCH] Add(Remove)ParameterQuickFix is not available for unmodifiable files --- .../jet/lang/resolve/BindingContextUtils.java | 5 +++- .../quickfix/ChangeFunctionSignatureFix.java | 30 ++++++++++++++++++- ...foreAddParameterNotAvailableForBuiltins.kt | 6 ++++ ...eforeAddParameterNotAvailableForLibrary.kt | 6 ++++ ...eRemoveParameterNotAvailableForBuiltins.kt | 6 ++++ .../quickfix/QuickFixTestGenerated.java | 15 ++++++++++ 6 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 idea/testData/quickfix/changeSignature/beforeAddParameterNotAvailableForBuiltins.kt create mode 100644 idea/testData/quickfix/changeSignature/beforeAddParameterNotAvailableForLibrary.kt create mode 100644 idea/testData/quickfix/changeSignature/beforeRemoveParameterNotAvailableForBuiltins.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContextUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContextUtils.java index 3cbc5eb985f..75db515663b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContextUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContextUtils.java @@ -195,7 +195,10 @@ public class BindingContextUtils { } @NotNull - private static List callableDescriptorToDeclarations(@NotNull BindingContext context, @NotNull CallableMemberDescriptor callable) { + public static List callableDescriptorToDeclarations( + @NotNull BindingContext context, + @NotNull CallableMemberDescriptor callable + ) { if (callable.getKind() == SYNTHESIZED) { CallableMemberDescriptor original = callable.getOriginal(); if (original instanceof SynthesizedCallableMemberDescriptor) { diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeFunctionSignatureFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeFunctionSignatureFix.java index 63fdb0c1575..3bc35b4b9a3 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeFunctionSignatureFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeFunctionSignatureFix.java @@ -16,17 +16,24 @@ package org.jetbrains.jet.plugin.quickfix; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; import com.intellij.psi.PsiNameIdentifierOwner; import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.lang.descriptors.*; +import org.jetbrains.jet.lang.descriptors.CallableDescriptor; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; +import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; +import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; import org.jetbrains.jet.lang.diagnostics.Diagnostic; import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters1; import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters2; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; +import org.jetbrains.jet.lang.resolve.BindingContextUtils; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.checker.JetTypeChecker; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; @@ -64,6 +71,27 @@ public abstract class ChangeFunctionSignatureFix extends JetIntentionAction declarations = BindingContextUtils.callableDescriptorToDeclarations(bindingContext, functionDescriptor); + if (declarations.isEmpty()) { + return false; + } + + for (PsiElement declaration : declarations) { + if (!QuickFixUtil.canModifyElement(declaration)) { + return false; + } + } + + return true; + } + protected static String getNewArgumentName(ValueArgument argument, JetNameValidator validator) { JetValueArgumentName argumentName = argument.getArgumentName(); JetExpression expression = argument.getArgumentExpression(); diff --git a/idea/testData/quickfix/changeSignature/beforeAddParameterNotAvailableForBuiltins.kt b/idea/testData/quickfix/changeSignature/beforeAddParameterNotAvailableForBuiltins.kt new file mode 100644 index 00000000000..1c59de1f7b4 --- /dev/null +++ b/idea/testData/quickfix/changeSignature/beforeAddParameterNotAvailableForBuiltins.kt @@ -0,0 +1,6 @@ +// "Add parameter to function 'equals'" "false" +// ERROR: Too many arguments for public fun jet.Any?.equals(other: jet.Any?): jet.Boolean defined in jet + +fun f(d: Any) { + d.equals("a", "b") +} \ No newline at end of file diff --git a/idea/testData/quickfix/changeSignature/beforeAddParameterNotAvailableForLibrary.kt b/idea/testData/quickfix/changeSignature/beforeAddParameterNotAvailableForLibrary.kt new file mode 100644 index 00000000000..b1634ca560a --- /dev/null +++ b/idea/testData/quickfix/changeSignature/beforeAddParameterNotAvailableForLibrary.kt @@ -0,0 +1,6 @@ +// "Add parameter to function 'equals'" "false" +// ERROR: Too many arguments for public open fun equals(p0: jet.Any?): jet.Boolean defined in java.lang.Object + +fun f(d: java.lang.Object) { + d.equals("a", "b") +} \ No newline at end of file diff --git a/idea/testData/quickfix/changeSignature/beforeRemoveParameterNotAvailableForBuiltins.kt b/idea/testData/quickfix/changeSignature/beforeRemoveParameterNotAvailableForBuiltins.kt new file mode 100644 index 00000000000..3e647e5a812 --- /dev/null +++ b/idea/testData/quickfix/changeSignature/beforeRemoveParameterNotAvailableForBuiltins.kt @@ -0,0 +1,6 @@ +// "Remove parameter 'other'" "false" +// ERROR: No value passed for parameter other + +fun f(d: Boolean) { + d.or() +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java index 40eb97f6be1..99c13a42cb9 100644 --- a/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java @@ -375,6 +375,16 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest("idea/testData/quickfix/changeSignature/beforeAddFunctionParameterAndChangeTypes.kt"); } + @TestMetadata("beforeAddParameterNotAvailableForBuiltins.kt") + public void testAddParameterNotAvailableForBuiltins() throws Exception { + doTest("idea/testData/quickfix/changeSignature/beforeAddParameterNotAvailableForBuiltins.kt"); + } + + @TestMetadata("beforeAddParameterNotAvailableForLibrary.kt") + public void testAddParameterNotAvailableForLibrary() throws Exception { + doTest("idea/testData/quickfix/changeSignature/beforeAddParameterNotAvailableForLibrary.kt"); + } + @TestMetadata("beforeAddParameterToFakeOverride.kt") public void testAddParameterToFakeOverride() throws Exception { doTest("idea/testData/quickfix/changeSignature/beforeAddParameterToFakeOverride.kt"); @@ -449,6 +459,11 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest("idea/testData/quickfix/changeSignature/beforeRemoveParameterFromFakeOverride.kt"); } + @TestMetadata("beforeRemoveParameterNotAvailableForBuiltins.kt") + public void testRemoveParameterNotAvailableForBuiltins() throws Exception { + doTest("idea/testData/quickfix/changeSignature/beforeRemoveParameterNotAvailableForBuiltins.kt"); + } + @TestMetadata("beforeRemoveUnusedParameter.kt") public void testRemoveUnusedParameter() throws Exception { doTest("idea/testData/quickfix/changeSignature/beforeRemoveUnusedParameter.kt");