Made rename refactoring inplace for loop, catch and function literal parameters.
#KT-1296 fixed
This commit is contained in:
@@ -1006,9 +1006,15 @@ public class JetPsiUtil {
|
|||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public static JetElement getEnclosingElementForLocalDeclaration(@Nullable JetNamedDeclaration declaration) {
|
public static JetElement getEnclosingElementForLocalDeclaration(@Nullable JetNamedDeclaration declaration) {
|
||||||
if (declaration instanceof JetTypeParameter || declaration instanceof JetParameter) {
|
if (declaration instanceof JetTypeParameter) {
|
||||||
declaration = PsiTreeUtil.getParentOfType(declaration, JetNamedDeclaration.class);
|
declaration = PsiTreeUtil.getParentOfType(declaration, JetNamedDeclaration.class);
|
||||||
}
|
}
|
||||||
|
else if (declaration instanceof JetParameter) {
|
||||||
|
PsiElement parent = declaration.getParent();
|
||||||
|
if (parent != null && parent.getParent() instanceof JetNamedFunction) {
|
||||||
|
declaration = (JetNamedFunction) parent.getParent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//noinspection unchecked
|
//noinspection unchecked
|
||||||
JetElement container = PsiTreeUtil.getParentOfType(
|
JetElement container = PsiTreeUtil.getParentOfType(
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import com.intellij.lang.refactoring.RefactoringSupportProvider;
|
|||||||
import com.intellij.psi.PsiElement;
|
import com.intellij.psi.PsiElement;
|
||||||
import com.intellij.refactoring.RefactoringActionHandler;
|
import com.intellij.refactoring.RefactoringActionHandler;
|
||||||
import com.intellij.refactoring.changeSignature.ChangeSignatureHandler;
|
import com.intellij.refactoring.changeSignature.ChangeSignatureHandler;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.lang.psi.*;
|
import org.jetbrains.jet.lang.psi.*;
|
||||||
import org.jetbrains.jet.plugin.refactoring.changeSignature.JetChangeSignatureHandler;
|
import org.jetbrains.jet.plugin.refactoring.changeSignature.JetChangeSignatureHandler;
|
||||||
@@ -28,7 +29,7 @@ import org.jetbrains.jet.plugin.refactoring.safeDelete.KotlinSafeDeleteProcessor
|
|||||||
|
|
||||||
public class JetRefactoringSupportProvider extends RefactoringSupportProvider {
|
public class JetRefactoringSupportProvider extends RefactoringSupportProvider {
|
||||||
@Override
|
@Override
|
||||||
public boolean isSafeDeleteAvailable(PsiElement element) {
|
public boolean isSafeDeleteAvailable(@NotNull PsiElement element) {
|
||||||
return KotlinSafeDeleteProcessor.canDeleteElement(element);
|
return KotlinSafeDeleteProcessor.canDeleteElement(element);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -38,7 +39,7 @@ public class JetRefactoringSupportProvider extends RefactoringSupportProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isInplaceRenameAvailable(PsiElement element, PsiElement context) {
|
public boolean isInplaceRenameAvailable(@NotNull PsiElement element, PsiElement context) {
|
||||||
if (element instanceof JetProperty) {
|
if (element instanceof JetProperty) {
|
||||||
JetProperty property = (JetProperty) element;
|
JetProperty property = (JetProperty) element;
|
||||||
if (property.isLocal()) return true;
|
if (property.isLocal()) return true;
|
||||||
@@ -47,6 +48,16 @@ public class JetRefactoringSupportProvider extends RefactoringSupportProvider {
|
|||||||
JetFunction function = (JetFunction) element;
|
JetFunction function = (JetFunction) element;
|
||||||
if (function.isLocal()) return true;
|
if (function.isLocal()) return true;
|
||||||
}
|
}
|
||||||
|
else if (element instanceof JetParameter) {
|
||||||
|
PsiElement parent = element.getParent();
|
||||||
|
if (parent instanceof JetForExpression) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (parent instanceof JetParameterList) {
|
||||||
|
PsiElement grandparent = parent.getParent();
|
||||||
|
return grandparent instanceof JetCatchClause || grandparent instanceof JetFunctionLiteral;
|
||||||
|
}
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
fun f() {
|
||||||
|
for (<caret>i in 1..2) {
|
||||||
|
println(i + i)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
fun f() {
|
||||||
|
for (<caret>j in 1..2) {
|
||||||
|
println(j + j)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
fun f() {
|
||||||
|
val f: (Int) -> Int = { <caret>x -> x + x }
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
fun f() {
|
||||||
|
val f: (Int) -> Int = { <caret>y -> y + y }
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
fun f() {
|
||||||
|
val f = { (<caret>x: Int) -> x + x }
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
fun f() {
|
||||||
|
val f = { (<caret>y: Int) -> y + y }
|
||||||
|
}
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
fun f(<caret>a: String) {
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fun <caret>foo(a: Int) {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun f() {
|
||||||
|
foo(1)
|
||||||
|
foo(217)
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fun f() {
|
||||||
|
fun <caret>foo(a: Int) {
|
||||||
|
}
|
||||||
|
|
||||||
|
foo(1)
|
||||||
|
foo(217)
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fun f() {
|
||||||
|
fun <caret>bar(a: Int) {
|
||||||
|
}
|
||||||
|
|
||||||
|
bar(1)
|
||||||
|
bar(217)
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
fun f() {
|
||||||
|
val <caret>x = 5
|
||||||
|
println(x + x * x)
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
fun f() {
|
||||||
|
val <caret>y = 5
|
||||||
|
println(y + y * y)
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
val <caret>x = 5
|
||||||
|
|
||||||
|
fun f() {
|
||||||
|
println(x + x * x)
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fun f() {
|
||||||
|
try {
|
||||||
|
}
|
||||||
|
catch (<caret>e: Exception) {
|
||||||
|
println(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fun f() {
|
||||||
|
try {
|
||||||
|
}
|
||||||
|
catch (<caret>e1: Exception) {
|
||||||
|
println(e1)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,96 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2013 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.jet.plugin.refactoring
|
||||||
|
|
||||||
|
import com.intellij.testFramework.LightCodeInsightTestCase
|
||||||
|
import com.intellij.codeInsight.TargetElementUtilBase
|
||||||
|
import com.intellij.testFramework.LightPlatformCodeInsightTestCase
|
||||||
|
import com.intellij.testFramework.fixtures.CodeInsightTestUtil
|
||||||
|
import com.intellij.refactoring.rename.inplace.VariableInplaceRenameHandler
|
||||||
|
import kotlin.test.*
|
||||||
|
import com.intellij.lang.java.JavaRefactoringSupportProvider
|
||||||
|
import com.intellij.testFramework.TestDataProvider
|
||||||
|
import com.intellij.testFramework.LightPlatformTestCase
|
||||||
|
import com.intellij.ide.DataManager
|
||||||
|
import org.jetbrains.jet.plugin.PluginTestCaseBase
|
||||||
|
import com.intellij.openapi.actionSystem.impl.SimpleDataContext
|
||||||
|
import com.intellij.openapi.actionSystem.CommonDataKeys
|
||||||
|
import com.intellij.openapi.actionSystem.DataContext
|
||||||
|
|
||||||
|
public class InplaceRenameTest : LightCodeInsightTestCase() {
|
||||||
|
override fun isRunInWriteAction(): Boolean = false
|
||||||
|
override fun getTestDataPath(): String = PluginTestCaseBase.getTestDataPathBase() + "/refactoring/rename/inplace/"
|
||||||
|
|
||||||
|
public fun testLocalVal() {
|
||||||
|
doTestInplaceRename("y")
|
||||||
|
}
|
||||||
|
|
||||||
|
public fun testForLoop() {
|
||||||
|
doTestInplaceRename("j")
|
||||||
|
}
|
||||||
|
|
||||||
|
public fun testTryCatch() {
|
||||||
|
doTestInplaceRename("e1")
|
||||||
|
}
|
||||||
|
|
||||||
|
public fun testFunctionLiteral() {
|
||||||
|
doTestInplaceRename("y")
|
||||||
|
}
|
||||||
|
|
||||||
|
public fun testFunctionLiteralParenthesis() {
|
||||||
|
doTestInplaceRename("y")
|
||||||
|
}
|
||||||
|
|
||||||
|
public fun testLocalFunction() {
|
||||||
|
doTestInplaceRename("bar")
|
||||||
|
}
|
||||||
|
|
||||||
|
public fun testFunctionParameterNotInplace() {
|
||||||
|
doTestInplaceRename(null)
|
||||||
|
}
|
||||||
|
|
||||||
|
public fun testGlobalFunctionNotInplace() {
|
||||||
|
doTestInplaceRename(null)
|
||||||
|
}
|
||||||
|
|
||||||
|
public fun testTopLevelValNotInplace() {
|
||||||
|
doTestInplaceRename(null)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun doTestInplaceRename(newName: String?) {
|
||||||
|
configureByFile(getTestName(false) + ".kt")
|
||||||
|
val element = TargetElementUtilBase.findTargetElement(
|
||||||
|
LightPlatformCodeInsightTestCase.myEditor,
|
||||||
|
TargetElementUtilBase.ELEMENT_NAME_ACCEPTED or TargetElementUtilBase.REFERENCED_ELEMENT_ACCEPTED
|
||||||
|
)
|
||||||
|
|
||||||
|
assertNotNull(element)
|
||||||
|
|
||||||
|
val dataContext = SimpleDataContext.getSimpleContext(CommonDataKeys.PSI_ELEMENT.getName(), element!!,
|
||||||
|
LightPlatformCodeInsightTestCase.getCurrentEditorDataContext())
|
||||||
|
|
||||||
|
val handler = VariableInplaceRenameHandler()
|
||||||
|
if (newName == null) {
|
||||||
|
assertFalse(handler.isRenaming(dataContext), "In-place rename is allowed for " + element)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
assertTrue(handler.isRenaming(dataContext), "In-place rename not allowed for " + element)
|
||||||
|
CodeInsightTestUtil.doInlineRename(handler, newName, LightPlatformCodeInsightTestCase.getEditor(), element)
|
||||||
|
checkResultByFile(getTestName(false) + ".kt.after")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user