Show error hint when trying to refactor synthesized function
This commit is contained in:
@@ -21,10 +21,7 @@ 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.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.descriptors.*;
|
||||
import org.jetbrains.jet.lang.diagnostics.Diagnostic;
|
||||
import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters1;
|
||||
import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters2;
|
||||
@@ -41,6 +38,8 @@ import org.jetbrains.jet.plugin.refactoring.changeSignature.JetParameterInfo;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor.Kind.SYNTHESIZED;
|
||||
|
||||
public abstract class ChangeFunctionSignatureFix extends JetIntentionAction<PsiElement> {
|
||||
protected final PsiElement context;
|
||||
protected final FunctionDescriptor functionDescriptor;
|
||||
@@ -186,6 +185,11 @@ public abstract class ChangeFunctionSignatureFix extends JetIntentionAction<PsiE
|
||||
if (functionDescriptor == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (functionDescriptor.getKind() == SYNTHESIZED) {
|
||||
return null;
|
||||
}
|
||||
|
||||
BindingContext bindingContext =
|
||||
AnalyzerFacadeWithCache.analyzeFileWithCache((JetFile) context.getContainingFile()).getBindingContext();
|
||||
if (descriptor instanceof ValueParameterDescriptor) {
|
||||
|
||||
@@ -9,6 +9,7 @@ cannot.refactor.namespace.expression=Cannot intoduce namespace reference
|
||||
cannot.extract.method=Cannot find statements to extract
|
||||
cannot.find.class.to.extract=Cannot find class to extract method
|
||||
cannot.refactor.expression.should.have.inferred.type=Expression should have inferred type
|
||||
cannot.refactor.synthesized.function=Cannot refactor synthesized function ''{0}''
|
||||
|
||||
error.wrong.caret.position.function.or.constructor.name=The caret should be positioned at the name of the function or constructor to be refactored.
|
||||
error.cant.refactor.vararg.functions=Can't refactor the function with variable arguments
|
||||
|
||||
+7
-4
@@ -32,10 +32,7 @@ import com.intellij.refactoring.util.CommonRefactoringUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.annotations.TestOnly;
|
||||
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
||||
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.descriptors.*;
|
||||
import org.jetbrains.jet.lang.psi.*;
|
||||
import org.jetbrains.jet.lang.resolve.BindingContext;
|
||||
import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache;
|
||||
@@ -182,6 +179,12 @@ public class JetChangeSignatureHandler implements ChangeSignatureHandler {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
if (((FunctionDescriptor) descriptor).getKind() == SYNTHESIZED) {
|
||||
String message = JetRefactoringBundle.message("cannot.refactor.synthesized.function", descriptor.getName());
|
||||
CommonRefactoringUtil.showErrorHint(project, editor, message, REFACTORING_NAME, HelpID.CHANGE_SIGNATURE);
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
return (FunctionDescriptor) descriptor;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
// "Add parameter to function 'component1'" "false"
|
||||
//ERROR: Too many arguments for internal final fun component1(): jet.Int defined in Data
|
||||
|
||||
data class Data(val i: Int) {}
|
||||
|
||||
fun usage(d: Data) {
|
||||
d.component1(2)
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
// "Add parameter to function 'component1'" "false"
|
||||
//ERROR: Too many arguments for internal final fun component1(): jet.Int defined in Data
|
||||
|
||||
data class Data(val i: Int) {}
|
||||
|
||||
fun usage(d: Data) {
|
||||
d.component1(<caret>2)
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
data class Data(val i: Int) {}
|
||||
|
||||
fun usage(d: Data) {
|
||||
d.<caret>component1()
|
||||
}
|
||||
@@ -414,6 +414,11 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
|
||||
doTest("idea/testData/quickfix/changeSignature/beforeLinearHierarchy.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("beforeNotAvailableForSynthesized.kt")
|
||||
public void testNotAvailableForSynthesized() throws Exception {
|
||||
doTest("idea/testData/quickfix/changeSignature/beforeNotAvailableForSynthesized.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("beforeRemoveConstructorParameter.kt")
|
||||
public void testRemoveConstructorParameter() throws Exception {
|
||||
doTest("idea/testData/quickfix/changeSignature/beforeRemoveConstructorParameter.kt");
|
||||
|
||||
+12
@@ -34,6 +34,7 @@ import org.jetbrains.jet.lang.resolve.BindingContext;
|
||||
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
|
||||
import org.jetbrains.jet.plugin.PluginTestCaseBase;
|
||||
import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache;
|
||||
import org.jetbrains.jet.plugin.refactoring.JetRefactoringBundle;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
@@ -80,6 +81,17 @@ public class JetChangeSignatureTest extends LightCodeInsightTestCase {
|
||||
doTest(changeInfo);
|
||||
}
|
||||
|
||||
public void testSynthesized() throws Exception {
|
||||
try {
|
||||
getChangeInfo();
|
||||
}
|
||||
catch (CommonRefactoringUtil.RefactoringErrorHintException e) {
|
||||
assertEquals(JetRefactoringBundle.message("cannot.refactor.synthesized.function", "component1"), e.getMessage());
|
||||
return;
|
||||
}
|
||||
fail();
|
||||
}
|
||||
|
||||
public void testPreferContainedInClass() throws Exception {
|
||||
JetChangeInfo changeInfo = getChangeInfo();
|
||||
assertEquals("param", changeInfo.getNewParameters()[0].getName());
|
||||
|
||||
Reference in New Issue
Block a user