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
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) {
CallableMemberDescriptor original = callable.getOriginal();
if (original instanceof SynthesizedCallableMemberDescriptor<?>) {
@@ -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<PsiE
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) {
JetValueArgumentName argumentName = argument.getArgumentName();
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");
}
@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");