ImportMemberIntention: make more flexible based on caret position
#KT-31924 Fixed
This commit is contained in:
@@ -36,13 +36,10 @@ class ImportMemberIntention : SelfTargetingOffsetIndependentIntention<KtNameRefe
|
|||||||
KtNameReferenceExpression::class.java,
|
KtNameReferenceExpression::class.java,
|
||||||
"Add import for member"
|
"Add import for member"
|
||||||
), HighPriorityAction {
|
), HighPriorityAction {
|
||||||
|
|
||||||
private fun getFullQualifier(element: KtNameReferenceExpression): KtQualifiedExpression? = element.getTopmostParentOfType()
|
|
||||||
|
|
||||||
override fun isApplicableTo(element: KtNameReferenceExpression): Boolean {
|
override fun isApplicableTo(element: KtNameReferenceExpression): Boolean {
|
||||||
if (element.getQualifiedElement() == element) return false //Ignore simple name expressions
|
if (element.getQualifiedElement() == element) return false //Ignore simple name expressions
|
||||||
|
|
||||||
val qualifiedExpression = getFullQualifier(element) ?: element.getQualifiedElement()
|
val qualifiedExpression = element.getQualifiedElement()
|
||||||
|
|
||||||
if (element.isInImportDirective()) return false
|
if (element.isInImportDirective()) return false
|
||||||
|
|
||||||
@@ -54,7 +51,7 @@ class ImportMemberIntention : SelfTargetingOffsetIndependentIntention<KtNameRefe
|
|||||||
|
|
||||||
override fun applyTo(element: KtNameReferenceExpression, editor: Editor?) {
|
override fun applyTo(element: KtNameReferenceExpression, editor: Editor?) {
|
||||||
|
|
||||||
val qualifiedElement = getFullQualifier(element)
|
val qualifiedElement = element.getQualifiedElement() as? KtQualifiedExpression
|
||||||
|
|
||||||
// If expression is fqn reference, take full qualified selector, otherwise (Type reference) take element
|
// If expression is fqn reference, take full qualified selector, otherwise (Type reference) take element
|
||||||
val targetElement = qualifiedElement?.selectorExpression?.getQualifiedElementSelector() ?: element
|
val targetElement = qualifiedElement?.selectorExpression?.getQualifiedElementSelector() ?: element
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
// INTENTION_TEXT: "Add import for 'pack.name.Fixtures'"
|
||||||
|
|
||||||
|
package pack.name
|
||||||
|
|
||||||
|
class Fixtures {
|
||||||
|
class Register {
|
||||||
|
class Domain {
|
||||||
|
object UserRepository {
|
||||||
|
val authSuccess = true
|
||||||
|
val authError = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
pack.name.<caret>Fixtures.Register.Domain.UserRepository.authSuccess
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
// INTENTION_TEXT: "Add import for 'pack.name.Fixtures'"
|
||||||
|
|
||||||
|
package pack.name
|
||||||
|
|
||||||
|
class Fixtures {
|
||||||
|
class Register {
|
||||||
|
class Domain {
|
||||||
|
object UserRepository {
|
||||||
|
val authSuccess = true
|
||||||
|
val authError = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
Fixtures.Register.Domain.UserRepository.authSuccess
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
// INTENTION_TEXT: "Add import for 'pack.name.Fixtures.Register'"
|
||||||
|
|
||||||
|
package pack.name
|
||||||
|
|
||||||
|
class Fixtures {
|
||||||
|
class Register {
|
||||||
|
class Domain {
|
||||||
|
object UserRepository {
|
||||||
|
val authSuccess = true
|
||||||
|
val authError = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
pack.name.Fixtures.Register<caret>.Domain.UserRepository.authSuccess
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
// INTENTION_TEXT: "Add import for 'pack.name.Fixtures.Register'"
|
||||||
|
|
||||||
|
package pack.name
|
||||||
|
|
||||||
|
import pack.name.Fixtures.Register
|
||||||
|
|
||||||
|
class Fixtures {
|
||||||
|
class Register {
|
||||||
|
class Domain {
|
||||||
|
object UserRepository {
|
||||||
|
val authSuccess = true
|
||||||
|
val authError = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
Register.Domain.UserRepository.authSuccess
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
// INTENTION_TEXT: "Add import for 'pack.name.Fixtures.Register.Domain.UserRepository.authSuccess'"
|
||||||
|
|
||||||
|
package pack.name
|
||||||
|
|
||||||
|
class Fixtures {
|
||||||
|
class Register {
|
||||||
|
class Domain {
|
||||||
|
object UserRepository {
|
||||||
|
val authSuccess = true
|
||||||
|
val authError = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
pack.name.Fixtures.Register.Domain.UserRepository.authSuccess<caret>
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
// INTENTION_TEXT: "Add import for 'pack.name.Fixtures.Register.Domain.UserRepository.authSuccess'"
|
||||||
|
|
||||||
|
package pack.name
|
||||||
|
|
||||||
|
import pack.name.Fixtures.Register.Domain.UserRepository.authSuccess
|
||||||
|
|
||||||
|
class Fixtures {
|
||||||
|
class Register {
|
||||||
|
class Domain {
|
||||||
|
object UserRepository {
|
||||||
|
val authSuccess = true
|
||||||
|
val authError = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
authSuccess
|
||||||
|
}
|
||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
// INTENTION_TEXT: "Add import for 'java.util.ArrayList'"
|
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
|
// IS_APPLICABLE: false
|
||||||
|
|
||||||
fun test() {
|
fun test() {
|
||||||
val myList = java.util<caret>.ArrayList<Int>()
|
val myList = java.util<caret>.ArrayList<Int>()
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
import java.util.ArrayList
|
|
||||||
|
|
||||||
// INTENTION_TEXT: "Add import for 'java.util.ArrayList'"
|
|
||||||
// WITH_RUNTIME
|
|
||||||
|
|
||||||
fun test() {
|
|
||||||
val myList = ArrayList<Int>()
|
|
||||||
val otherList = ArrayList<String>()
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
// INTENTION_TEXT: "Add import for 'p.Container.Nested'"
|
// INTENTION_TEXT: "Add import for 'p.Container'"
|
||||||
fun test() {
|
fun test() {
|
||||||
p.<caret>Container.Nested()
|
p.<caret>Container.Nested()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import p.Container.Nested
|
import p.Container
|
||||||
|
|
||||||
// INTENTION_TEXT: "Add import for 'p.Container.Nested'"
|
// INTENTION_TEXT: "Add import for 'p.Container'"
|
||||||
fun test() {
|
fun test() {
|
||||||
Nested()
|
Container.Nested()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8663,6 +8663,21 @@ public class IntentionTestGenerated extends AbstractIntentionTest {
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/intentions/importMember"), Pattern.compile("^([\\w\\-_]+)\\.(kt|kts)$"), TargetBackend.ANY, true);
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/intentions/importMember"), Pattern.compile("^([\\w\\-_]+)\\.(kt|kts)$"), TargetBackend.ANY, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("ClassCallChain.kt")
|
||||||
|
public void testClassCallChain() throws Exception {
|
||||||
|
runTest("idea/testData/intentions/importMember/ClassCallChain.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("ClassCallChain2.kt")
|
||||||
|
public void testClassCallChain2() throws Exception {
|
||||||
|
runTest("idea/testData/intentions/importMember/ClassCallChain2.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("ClassCallChain3.kt")
|
||||||
|
public void testClassCallChain3() throws Exception {
|
||||||
|
runTest("idea/testData/intentions/importMember/ClassCallChain3.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("EnumMember.kt")
|
@TestMetadata("EnumMember.kt")
|
||||||
public void testEnumMember() throws Exception {
|
public void testEnumMember() throws Exception {
|
||||||
runTest("idea/testData/intentions/importMember/EnumMember.kt");
|
runTest("idea/testData/intentions/importMember/EnumMember.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user