Add(Remove)ParameterQuickFix is not available for unmodifiable files

This commit is contained in:
Pavel V. Talanov
2013-11-11 17:57:03 +04:00
parent 3e97203f85
commit f9a2b09a4e
6 changed files with 66 additions and 2 deletions
@@ -195,7 +195,10 @@ public class BindingContextUtils {
} }
@NotNull @NotNull
private static List<PsiElement> callableDescriptorToDeclarations(@NotNull BindingContext context, @NotNull CallableMemberDescriptor callable) { public static List<PsiElement> callableDescriptorToDeclarations(
@NotNull BindingContext context,
@NotNull CallableMemberDescriptor callable
) {
if (callable.getKind() == SYNTHESIZED) { if (callable.getKind() == SYNTHESIZED) {
CallableMemberDescriptor original = callable.getOriginal(); CallableMemberDescriptor original = callable.getOriginal();
if (original instanceof SynthesizedCallableMemberDescriptor<?>) { if (original instanceof SynthesizedCallableMemberDescriptor<?>) {
@@ -16,17 +16,24 @@
package org.jetbrains.jet.plugin.quickfix; 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.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiNameIdentifierOwner; import com.intellij.psi.PsiNameIdentifierOwner;
import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; 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.Diagnostic;
import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters1; import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters1;
import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters2; import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters2;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext; 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.JetType;
import org.jetbrains.jet.lang.types.checker.JetTypeChecker; import org.jetbrains.jet.lang.types.checker.JetTypeChecker;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
@@ -64,6 +71,27 @@ public abstract class ChangeFunctionSignatureFix extends JetIntentionAction<PsiE
return false; return false;
} }
@Override
public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) {
if (!super.isAvailable(project, editor, file)) {
return false;
}
BindingContext bindingContext = AnalyzerFacadeWithCache.analyzeFileWithCache((JetFile) file).getBindingContext();
List<PsiElement> 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) { protected static String getNewArgumentName(ValueArgument argument, JetNameValidator validator) {
JetValueArgumentName argumentName = argument.getArgumentName(); JetValueArgumentName argumentName = argument.getArgumentName();
JetExpression expression = argument.getArgumentExpression(); JetExpression expression = argument.getArgumentExpression();
@@ -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", <caret>"b")
}
@@ -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", <caret>"b")
}
@@ -0,0 +1,6 @@
// "Remove parameter 'other'" "false"
// ERROR: No value passed for parameter other
fun f(d: Boolean) {
d.or(<caret>)
}
@@ -375,6 +375,16 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
doTest("idea/testData/quickfix/changeSignature/beforeAddFunctionParameterAndChangeTypes.kt"); 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") @TestMetadata("beforeAddParameterToFakeOverride.kt")
public void testAddParameterToFakeOverride() throws Exception { public void testAddParameterToFakeOverride() throws Exception {
doTest("idea/testData/quickfix/changeSignature/beforeAddParameterToFakeOverride.kt"); doTest("idea/testData/quickfix/changeSignature/beforeAddParameterToFakeOverride.kt");
@@ -449,6 +459,11 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
doTest("idea/testData/quickfix/changeSignature/beforeRemoveParameterFromFakeOverride.kt"); 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") @TestMetadata("beforeRemoveUnusedParameter.kt")
public void testRemoveUnusedParameter() throws Exception { public void testRemoveUnusedParameter() throws Exception {
doTest("idea/testData/quickfix/changeSignature/beforeRemoveUnusedParameter.kt"); doTest("idea/testData/quickfix/changeSignature/beforeRemoveUnusedParameter.kt");