Merge pull request #2773 from t-kameyama/KT-28607
KT-28607 Extract/Introduce variable fails if caret is just after expression
This commit is contained in:
@@ -22,6 +22,7 @@ import com.intellij.openapi.editor.Editor
|
|||||||
import com.intellij.openapi.ui.popup.JBPopupAdapter
|
import com.intellij.openapi.ui.popup.JBPopupAdapter
|
||||||
import com.intellij.openapi.ui.popup.JBPopupFactory
|
import com.intellij.openapi.ui.popup.JBPopupFactory
|
||||||
import com.intellij.openapi.ui.popup.LightweightWindowEvent
|
import com.intellij.openapi.ui.popup.LightweightWindowEvent
|
||||||
|
import com.intellij.psi.PsiComment
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.psi.PsiFile
|
import com.intellij.psi.PsiFile
|
||||||
import com.intellij.psi.PsiWhiteSpace
|
import com.intellij.psi.PsiWhiteSpace
|
||||||
@@ -31,10 +32,13 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
|||||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||||
import org.jetbrains.kotlin.idea.core.util.CodeInsightUtils
|
import org.jetbrains.kotlin.idea.core.util.CodeInsightUtils
|
||||||
import org.jetbrains.kotlin.idea.refactoring.introduce.findExpressionOrStringFragment
|
import org.jetbrains.kotlin.idea.refactoring.introduce.findExpressionOrStringFragment
|
||||||
|
import org.jetbrains.kotlin.kdoc.psi.api.KDoc
|
||||||
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getNextSiblingIgnoringWhitespaceAndComments
|
import org.jetbrains.kotlin.psi.psiUtil.getNextSiblingIgnoringWhitespaceAndComments
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getParentOfTypeAndBranch
|
import org.jetbrains.kotlin.psi.psiUtil.getParentOfTypeAndBranch
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getPrevSiblingIgnoringWhitespaceAndComments
|
import org.jetbrains.kotlin.psi.psiUtil.getPrevSiblingIgnoringWhitespaceAndComments
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
||||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||||
import java.awt.Component
|
import java.awt.Component
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@@ -103,7 +107,11 @@ fun getSmartSelectSuggestions(
|
|||||||
|
|
||||||
var element: PsiElement? = file.findElementAt(offset) ?: return emptyList()
|
var element: PsiElement? = file.findElementAt(offset) ?: return emptyList()
|
||||||
|
|
||||||
if (element is PsiWhiteSpace) return getSmartSelectSuggestions(file, offset - 1, elementKind)
|
if (element is PsiWhiteSpace
|
||||||
|
|| element?.node?.elementType == KtTokens.RPAR
|
||||||
|
|| element is PsiComment
|
||||||
|
|| element?.getStrictParentOfType<KDoc>() != null
|
||||||
|
) return getSmartSelectSuggestions(file, offset - 1, elementKind)
|
||||||
|
|
||||||
val elements = ArrayList<KtElement>()
|
val elements = ArrayList<KtElement>()
|
||||||
while (element != null && !(element is KtBlockExpression && element.parent !is KtFunctionLiteral) &&
|
while (element != null && !(element is KtBlockExpression && element.parent !is KtFunctionLiteral) &&
|
||||||
|
|||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
class A {
|
||||||
|
val list = listOf(1, 2, 3)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo(a: A) {
|
||||||
|
for (x in a.list<caret>/* comment */) {
|
||||||
|
println(x)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
a.list
|
||||||
|
*/
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
class A {
|
||||||
|
val list = listOf(1, 2, 3)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo(a: A) {
|
||||||
|
for (x in a.list<caret>/** kdoc **/) {
|
||||||
|
println(x)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
a.list
|
||||||
|
*/
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
class A {
|
||||||
|
val list = listOf(1, 2, 3)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo(a: A) {
|
||||||
|
for (x in a.list<caret>) {
|
||||||
|
println(x)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
a.list
|
||||||
|
*/
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
class A {
|
||||||
|
val list = listOf(1, 2, 3)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo(a: A) {
|
||||||
|
for (x in a.list /*comment*/<caret>) {
|
||||||
|
println(x)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
a.list
|
||||||
|
*/
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
class A {
|
||||||
|
val list = listOf(1, 2, 3)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo(a: A) {
|
||||||
|
for (x in a.list /** kdoc **/<caret>) {
|
||||||
|
println(x)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
a.list
|
||||||
|
*/
|
||||||
@@ -28,6 +28,31 @@ public class SmartSelectionTestGenerated extends AbstractSmartSelectionTest {
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/smartSelection"), Pattern.compile("^([^.]+)\\.kt$"), true);
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/smartSelection"), Pattern.compile("^([^.]+)\\.kt$"), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("beforeComment.kt")
|
||||||
|
public void testBeforeComment() throws Exception {
|
||||||
|
runTest("idea/testData/smartSelection/beforeComment.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("beforeKDocComment.kt")
|
||||||
|
public void testBeforeKDocComment() throws Exception {
|
||||||
|
runTest("idea/testData/smartSelection/beforeKDocComment.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("beforeRightParenthesis.kt")
|
||||||
|
public void testBeforeRightParenthesis() throws Exception {
|
||||||
|
runTest("idea/testData/smartSelection/beforeRightParenthesis.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("beforeRightParenthesis2.kt")
|
||||||
|
public void testBeforeRightParenthesis2() throws Exception {
|
||||||
|
runTest("idea/testData/smartSelection/beforeRightParenthesis2.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("beforeRightParenthesis3.kt")
|
||||||
|
public void testBeforeRightParenthesis3() throws Exception {
|
||||||
|
runTest("idea/testData/smartSelection/beforeRightParenthesis3.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("commentsAndExtraSpaces.kt")
|
@TestMetadata("commentsAndExtraSpaces.kt")
|
||||||
public void testCommentsAndExtraSpaces() throws Exception {
|
public void testCommentsAndExtraSpaces() throws Exception {
|
||||||
runTest("idea/testData/smartSelection/commentsAndExtraSpaces.kt");
|
runTest("idea/testData/smartSelection/commentsAndExtraSpaces.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user