diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/KotlinIntroduceVariableHandler.java b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/KotlinIntroduceVariableHandler.java index 44767692efa..74fd2e00b7c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/KotlinIntroduceVariableHandler.java +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/KotlinIntroduceVariableHandler.java @@ -130,6 +130,13 @@ public class KotlinIntroduceVariableHandler extends KotlinIntroduceHandlerBase { } } + //noinspection unchecked + if (PsiTreeUtil.getNonStrictParentOfType(expression, + JetTypeReference.class, JetConstructorCalleeExpression.class, JetSuperExpression.class) != null) { + showErrorHint(project, editor, JetRefactoringBundle.message("cannot.refactor.no.container")); + return; + } + AnalysisResult analysisResult = ResolvePackage.analyzeAndGetResult(expression); final BindingContext bindingContext = analysisResult.getBindingContext(); final JetType expressionType = bindingContext.getType(expression); //can be null or error type diff --git a/idea/testData/refactoring/introduceVariable/ConstructorDelegationCall.kt b/idea/testData/refactoring/introduceVariable/ConstructorDelegationCall.kt new file mode 100644 index 00000000000..b2dc183f4da --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/ConstructorDelegationCall.kt @@ -0,0 +1,5 @@ +open class A(n: Int) + +class B { + constructor(x: Int) : A(x + 1) +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceVariable/ConstructorDelegationCall.kt.conflicts b/idea/testData/refactoring/introduceVariable/ConstructorDelegationCall.kt.conflicts new file mode 100644 index 00000000000..1568c6aea62 --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/ConstructorDelegationCall.kt.conflicts @@ -0,0 +1 @@ +Cannot refactor in this place diff --git a/idea/testData/refactoring/introduceVariable/DelegatorByExpressionInDelegate.kt b/idea/testData/refactoring/introduceVariable/DelegatorByExpressionInDelegate.kt new file mode 100644 index 00000000000..77b63a1bf99 --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/DelegatorByExpressionInDelegate.kt @@ -0,0 +1,7 @@ +interface T + +object O : T + +fun foo() { + val x = object : T by O {} +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceVariable/DelegatorByExpressionInDelegate.kt.after b/idea/testData/refactoring/introduceVariable/DelegatorByExpressionInDelegate.kt.after new file mode 100644 index 00000000000..3266675e4e9 --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/DelegatorByExpressionInDelegate.kt.after @@ -0,0 +1,8 @@ +interface T + +object O : T + +fun foo() { + val o = O + val x = object : T by o {} +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceVariable/DelegatorByExpressionInType.kt b/idea/testData/refactoring/introduceVariable/DelegatorByExpressionInType.kt new file mode 100644 index 00000000000..664c81a96b8 --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/DelegatorByExpressionInType.kt @@ -0,0 +1,7 @@ +interface T + +object O : T + +fun foo() { + val x = object : T by O {} +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceVariable/DelegatorByExpressionInType.kt.conflicts b/idea/testData/refactoring/introduceVariable/DelegatorByExpressionInType.kt.conflicts new file mode 100644 index 00000000000..1568c6aea62 --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/DelegatorByExpressionInType.kt.conflicts @@ -0,0 +1 @@ +Cannot refactor in this place diff --git a/idea/testData/refactoring/introduceVariable/DelegatorToSuperCallInArgument.kt b/idea/testData/refactoring/introduceVariable/DelegatorToSuperCallInArgument.kt new file mode 100644 index 00000000000..0ae3e56e57c --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/DelegatorToSuperCallInArgument.kt @@ -0,0 +1,5 @@ +open class A(n: Int) + +fun foo() { + val x = object : A(1) {} +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceVariable/DelegatorToSuperCallInArgument.kt.after b/idea/testData/refactoring/introduceVariable/DelegatorToSuperCallInArgument.kt.after new file mode 100644 index 00000000000..1f40cbc1b5a --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/DelegatorToSuperCallInArgument.kt.after @@ -0,0 +1,6 @@ +open class A(n: Int) + +fun foo() { + val i = 1 + val x = object : A(i) {} +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceVariable/DelegatorToSuperCallInType.kt b/idea/testData/refactoring/introduceVariable/DelegatorToSuperCallInType.kt new file mode 100644 index 00000000000..31465d54d35 --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/DelegatorToSuperCallInType.kt @@ -0,0 +1,3 @@ +fun foo() { + val x = object : Any() {} +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceVariable/DelegatorToSuperCallInType.kt.conflicts b/idea/testData/refactoring/introduceVariable/DelegatorToSuperCallInType.kt.conflicts new file mode 100644 index 00000000000..1568c6aea62 --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/DelegatorToSuperCallInType.kt.conflicts @@ -0,0 +1 @@ +Cannot refactor in this place diff --git a/idea/testData/refactoring/introduceVariable/DelegatorToSuperClass.kt b/idea/testData/refactoring/introduceVariable/DelegatorToSuperClass.kt new file mode 100644 index 00000000000..b6a6b14ac31 --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/DelegatorToSuperClass.kt @@ -0,0 +1,5 @@ +interface T + +fun foo() { + val x = object : T {} +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceVariable/DelegatorToSuperClass.kt.conflicts b/idea/testData/refactoring/introduceVariable/DelegatorToSuperClass.kt.conflicts new file mode 100644 index 00000000000..1568c6aea62 --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/DelegatorToSuperClass.kt.conflicts @@ -0,0 +1 @@ +Cannot refactor in this place diff --git a/idea/testData/refactoring/introduceVariable/SuperReference.kt b/idea/testData/refactoring/introduceVariable/SuperReference.kt new file mode 100644 index 00000000000..7777e5db89b --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/SuperReference.kt @@ -0,0 +1,11 @@ +open class A { + open fun foo() { + + } +} + +class B : A() { + override fun foo() { + super.foo() + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceVariable/SuperReference.kt.conflicts b/idea/testData/refactoring/introduceVariable/SuperReference.kt.conflicts new file mode 100644 index 00000000000..1568c6aea62 --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/SuperReference.kt.conflicts @@ -0,0 +1 @@ +Cannot refactor in this place diff --git a/idea/testData/refactoring/introduceVariable/ThisReference.kt b/idea/testData/refactoring/introduceVariable/ThisReference.kt new file mode 100644 index 00000000000..eda00010cbf --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/ThisReference.kt @@ -0,0 +1,9 @@ +class A { + fun bar() { + + } + + fun foo() { + this.foo() + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceVariable/ThisReference.kt.after b/idea/testData/refactoring/introduceVariable/ThisReference.kt.after new file mode 100644 index 00000000000..14c40f42c3f --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/ThisReference.kt.after @@ -0,0 +1,10 @@ +class A { + fun bar() { + + } + + fun foo() { + val a = this + a.foo() + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java index 507243e2705..8ec7c71a9b0 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java @@ -61,6 +61,42 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest { doIntroduceVariableTest(fileName); } + @TestMetadata("ConstructorDelegationCall.kt") + public void testConstructorDelegationCall() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/ConstructorDelegationCall.kt"); + doIntroduceVariableTest(fileName); + } + + @TestMetadata("DelegatorByExpressionInDelegate.kt") + public void testDelegatorByExpressionInDelegate() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/DelegatorByExpressionInDelegate.kt"); + doIntroduceVariableTest(fileName); + } + + @TestMetadata("DelegatorByExpressionInType.kt") + public void testDelegatorByExpressionInType() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/DelegatorByExpressionInType.kt"); + doIntroduceVariableTest(fileName); + } + + @TestMetadata("DelegatorToSuperCallInArgument.kt") + public void testDelegatorToSuperCallInArgument() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/DelegatorToSuperCallInArgument.kt"); + doIntroduceVariableTest(fileName); + } + + @TestMetadata("DelegatorToSuperCallInType.kt") + public void testDelegatorToSuperCallInType() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/DelegatorToSuperCallInType.kt"); + doIntroduceVariableTest(fileName); + } + + @TestMetadata("DelegatorToSuperClass.kt") + public void testDelegatorToSuperClass() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/DelegatorToSuperClass.kt"); + doIntroduceVariableTest(fileName); + } + @TestMetadata("DoWhileAddBlock.kt") public void testDoWhileAddBlock() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/DoWhileAddBlock.kt"); @@ -295,6 +331,18 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest { doIntroduceVariableTest(fileName); } + @TestMetadata("SuperReference.kt") + public void testSuperReference() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/SuperReference.kt"); + doIntroduceVariableTest(fileName); + } + + @TestMetadata("ThisReference.kt") + public void testThisReference() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/ThisReference.kt"); + doIntroduceVariableTest(fileName); + } + @TestMetadata("TwoExplicitReceivers.kt") public void testTwoExplicitReceivers() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/TwoExplicitReceivers.kt");