diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignatureUsageProcessor.java b/idea/src/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignatureUsageProcessor.java index d3ff0255c10..d96cd55c81c 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignatureUsageProcessor.java +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignatureUsageProcessor.java @@ -41,7 +41,6 @@ import org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils; 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.lang.types.TypeProjection; import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache; import org.jetbrains.jet.plugin.refactoring.changeSignature.usages.JetFunctionCallUsage; import org.jetbrains.jet.plugin.refactoring.changeSignature.usages.JetFunctionDefinitionUsage; @@ -49,7 +48,6 @@ import org.jetbrains.jet.plugin.refactoring.changeSignature.usages.JetParameterU import org.jetbrains.jet.plugin.refactoring.changeSignature.usages.JetUsageInfo; import org.jetbrains.jet.renderer.DescriptorRenderer; -import java.util.Collections; import java.util.List; import java.util.Set; @@ -136,8 +134,8 @@ public class JetChangeSignatureUsageProcessor implements ChangeSignatureUsagePro JetScope parametersScope = null; DeclarationDescriptor containingDeclaration = oldDescriptor != null ? oldDescriptor.getContainingDeclaration() : null; - if (oldDescriptor instanceof ConstructorDescriptor && containingDeclaration instanceof ClassDescriptor) - parametersScope = ((ClassDescriptor) containingDeclaration).getMemberScope(Collections.emptyList()); + if (oldDescriptor instanceof ConstructorDescriptor && containingDeclaration instanceof ClassDescriptorWithResolutionScopes) + parametersScope = ((ClassDescriptorWithResolutionScopes) containingDeclaration).getScopeForInitializerResolution(); else if (function instanceof JetFunction) parametersScope = getFunctionBodyScope((JetFunction) function, bindingContext); @@ -187,8 +185,8 @@ public class JetChangeSignatureUsageProcessor implements ChangeSignatureUsagePro @Nullable private static JetScope getFunctionScope(BindingContext bindingContext, DeclarationDescriptor containingDeclaration) { - if (containingDeclaration instanceof ClassDescriptor) - return ((ClassDescriptor) containingDeclaration).getMemberScope(ContainerUtil.emptyList()); + if (containingDeclaration instanceof ClassDescriptorWithResolutionScopes) + return ((ClassDescriptorWithResolutionScopes) containingDeclaration).getScopeForInitializerResolution(); else if (containingDeclaration instanceof FunctionDescriptorImpl) { PsiElement container = DescriptorToSourceUtils.descriptorToDeclaration(containingDeclaration); diff --git a/idea/testData/refactoring/changeSignature/GenericConstructorAfter.kt b/idea/testData/refactoring/changeSignature/GenericConstructorAfter.kt new file mode 100644 index 00000000000..5ffa0073b01 --- /dev/null +++ b/idea/testData/refactoring/changeSignature/GenericConstructorAfter.kt @@ -0,0 +1,14 @@ +open class C0(val x: X) {} + +open class C1 (var _x1: T? = null, _x2: Double?, val _x3: ((Int) -> Int)?) : C0<((Int) -> Int)?>(_x3){ + fun bar() { + val y1 = _x1; + val y2 = _x2; + } +} +class C2 : C1(1, 2.5, null) { + fun foo() { + var c = C1(2, 3.5, null); + c = C1(_x1 = 2, _x2 = 3.5, _x3 = null); + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignature/GenericConstructorBefore.kt b/idea/testData/refactoring/changeSignature/GenericConstructorBefore.kt new file mode 100644 index 00000000000..4affae6e17f --- /dev/null +++ b/idea/testData/refactoring/changeSignature/GenericConstructorBefore.kt @@ -0,0 +1,14 @@ +open class C0(val x: X) {} + +open class C1 protected (val x1: T? = null, var x2: Double, x3: ((Int) -> Int)?) : C0<((Int) -> Int)?>(x3){ + fun bar() { + val y1 = x1; + val y2 = x2; + } +} +class C2 : C1(1, 2.5, null) { + fun foo() { + var c = C1(2, 3.5, null); + c = C1(x1 = 2, x2 = 3.5, x3 = null); + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignature/GenericFunctionsAfter.kt b/idea/testData/refactoring/changeSignature/GenericFunctionsAfter.kt new file mode 100644 index 00000000000..3058bea9854 --- /dev/null +++ b/idea/testData/refactoring/changeSignature/GenericFunctionsAfter.kt @@ -0,0 +1,12 @@ +public fun foo(_x1: T? = null, _x2: Double?, _x3: ((T) -> T)?) { + foo(2, 3.5, null); + val y1 = _x1; + val y2 = _x2; + val y3 = _x3; + foo(_x3 = null, _x1 = 2, _x2 = 3.5); +} + +fun bar() { + foo(_x1 = 2, _x2 = 3.5, _x3 = null); + foo(_x3 = null, _x1 = 2, _x2 = 3.5); +} diff --git a/idea/testData/refactoring/changeSignature/GenericFunctionsBefore.kt b/idea/testData/refactoring/changeSignature/GenericFunctionsBefore.kt new file mode 100644 index 00000000000..a537b2620e3 --- /dev/null +++ b/idea/testData/refactoring/changeSignature/GenericFunctionsBefore.kt @@ -0,0 +1,12 @@ +fun foo(x1: T? = null, x2: Double, x3: ((T) -> T)?) { + foo(2, 3.5, null); + val y1 = x1; + val y2 = x2; + val y3 = x3; + foo(x3 = null, x1 = 2, x2 = 3.5); +} + +fun bar() { + foo(x1 = 2, x2 = 3.5, x3 = null); + foo(x3 = null, x1 = 2, x2 = 3.5); +} diff --git a/idea/tests/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignatureTest.java b/idea/tests/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignatureTest.java index d7cb186029a..2e0d6b13b53 100644 --- a/idea/tests/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignatureTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignatureTest.java @@ -122,6 +122,19 @@ public class JetChangeSignatureTest extends KotlinCodeInsightTestCase { doTest(changeInfo); } + public void testGenericConstructor() throws Exception { + JetChangeInfo changeInfo = getChangeInfo(); + changeInfo.setNewVisibility(Visibilities.PUBLIC); + changeInfo.getNewParameters()[0].setValOrVar(JetValVar.Var); + changeInfo.getNewParameters()[1].setValOrVar(JetValVar.None); + changeInfo.getNewParameters()[2].setValOrVar(JetValVar.Val); + changeInfo.getNewParameters()[0].setName("_x1"); + changeInfo.getNewParameters()[1].setName("_x2"); + changeInfo.getNewParameters()[2].setName("_x3"); + changeInfo.getNewParameters()[1].setTypeText("Double?"); + doTest(changeInfo); + } + public void testConstructorSwapArguments() throws Exception { JetChangeInfo changeInfo = getChangeInfo(); changeInfo.getNewParameters()[0].setName("_x1"); @@ -142,6 +155,16 @@ public class JetChangeSignatureTest extends KotlinCodeInsightTestCase { doTest(changeInfo); } + public void testGenericFunctions() throws Exception { + JetChangeInfo changeInfo = getChangeInfo(); + changeInfo.setNewVisibility(Visibilities.PUBLIC); + changeInfo.getNewParameters()[0].setName("_x1"); + changeInfo.getNewParameters()[1].setName("_x2"); + changeInfo.getNewParameters()[2].setName("_x3"); + changeInfo.getNewParameters()[1].setTypeText("Double?"); + doTest(changeInfo); + } + public void testExpressionFunction() throws Exception { JetChangeInfo changeInfo = getChangeInfo(); changeInfo.getNewParameters()[0].setName("x1");