Change Signature: Rename parameter in overriding functions

#KT-4045 Fixed
This commit is contained in:
Alexey Sedunov
2014-11-17 15:48:20 +03:00
parent ddccc0e640
commit c80c866d82
4 changed files with 35 additions and 22 deletions
@@ -21,15 +21,12 @@ import com.intellij.psi.PsiElement;
import com.intellij.refactoring.changeSignature.ParameterInfo;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.psi.JetExpression;
import org.jetbrains.jet.lang.psi.JetFunction;
import org.jetbrains.jet.lang.psi.JetParameter;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lexer.JetTokens;
import org.jetbrains.jet.plugin.caches.resolve.ResolvePackage;
import org.jetbrains.jet.renderer.DescriptorRenderer;
import java.util.List;
@@ -76,30 +73,20 @@ public class JetParameterInfo implements ParameterInfo {
}
public String getInheritedName(boolean isInherited, @Nullable PsiElement inheritedFunction, @NotNull JetMethodDescriptor baseFunction) {
if (!(inheritedFunction instanceof JetFunction))
return name;
if (!(isInherited && inheritedFunction instanceof JetFunction)) return name;
FunctionDescriptor baseFunctionDescriptor = baseFunction.getDescriptor();
assert baseFunctionDescriptor != null : "No descriptor for " + baseFunction.getMethod().getText();
JetFunction inheritedJetFunction = (JetFunction) inheritedFunction;
List<JetParameter> inheritedParameters = inheritedJetFunction.getValueParameters();
if (!isInherited || oldIndex < 0 || oldIndex >= baseFunction.getParametersCount() || oldIndex >= inheritedParameters.size())
return name;
if (oldIndex < 0 || oldIndex >= baseFunction.getParametersCount() || oldIndex >= inheritedParameters.size()) return name;
JetParameterInfo oldParam = baseFunction.getParameters().get(oldIndex);
JetParameter inheritedParam = inheritedParameters.get(oldIndex);
String inheritedParamName = inheritedParam.getName();
String inheritedParamName = inheritedParameters.get(oldIndex).getName();
String oldParamName = baseFunctionDescriptor.getValueParameters().get(oldIndex).getName().asString();
if (oldParam.getName().equals(inheritedParamName)) {
BindingContext bindingContext = ResolvePackage.analyze(inheritedJetFunction);
JetScope parametersScope = JetChangeSignatureUsageProcessor.getFunctionBodyScope(inheritedJetFunction, bindingContext);
if (parametersScope != null && parametersScope.getLocalVariable(Name.identifier(name)) == null)
return name;
else
return inheritedParamName;
}
else
return inheritedParamName;
return oldParamName.equals(inheritedParamName) ? name : inheritedParamName;
}
@Override
@@ -0,0 +1,9 @@
trait Foo {
fun bar(n: Int)
}
class Baz: Foo {
override fun bar(n: Int) {
}
}
@@ -0,0 +1,9 @@
trait Foo {
fun <caret>bar(s: String)
}
class Baz: Foo {
override fun bar(s: String) {
}
}
@@ -295,6 +295,14 @@ public class JetChangeSignatureTest extends KotlinCodeInsightTestCase {
doTest(changeInfo);
}
public void testParameterChangeInOverrides() throws Exception {
JetChangeInfo changeInfo = getChangeInfo();
JetParameterInfo parameterInfo = changeInfo.getNewParameters()[0];
parameterInfo.setName("n");
parameterInfo.setTypeText("Int");
doTest(changeInfo);
}
@NotNull
@Override
protected String getTestDataPath() {