Fixed KT-10602 Incorrect completion for class name
#KT-10602 Fixed
This commit is contained in:
+16
-6
@@ -20,6 +20,7 @@ import com.intellij.codeInsight.completion.InsertionContext
|
|||||||
import com.intellij.codeInsight.lookup.LookupElement
|
import com.intellij.codeInsight.lookup.LookupElement
|
||||||
import com.intellij.codeInsight.lookup.LookupElementDecorator
|
import com.intellij.codeInsight.lookup.LookupElementDecorator
|
||||||
import com.intellij.codeInsight.lookup.LookupElementPresentation
|
import com.intellij.codeInsight.lookup.LookupElementPresentation
|
||||||
|
import com.intellij.psi.PsiDocumentManager
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.idea.completion.BasicLookupElementFactory
|
import org.jetbrains.kotlin.idea.completion.BasicLookupElementFactory
|
||||||
@@ -30,6 +31,7 @@ import org.jetbrains.kotlin.idea.imports.importableFqName
|
|||||||
import org.jetbrains.kotlin.idea.quickfix.moveCaret
|
import org.jetbrains.kotlin.idea.quickfix.moveCaret
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
import org.jetbrains.kotlin.types.Variance
|
import org.jetbrains.kotlin.types.Variance
|
||||||
|
import org.jetbrains.kotlin.types.typeUtil.makeNotNullable
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
object ClassLiteralItems {
|
object ClassLiteralItems {
|
||||||
@@ -60,19 +62,27 @@ object ClassLiteralItems {
|
|||||||
|
|
||||||
for ((pair, matchedExpectedInfos) in typeAndSuffixToExpectedInfos) {
|
for ((pair, matchedExpectedInfos) in typeAndSuffixToExpectedInfos) {
|
||||||
val (type, suffix) = pair
|
val (type, suffix) = pair
|
||||||
var lookupElement = lookupElementFactory.createLookupElementForType(type) ?: continue
|
val typeToUse = if (KotlinBuiltIns.isArray(type)) {
|
||||||
val text = lookupElement.lookupString + suffix
|
type.makeNotNullable()
|
||||||
lookupElement = object : LookupElementDecorator<LookupElement>(lookupElement) {
|
}
|
||||||
override fun getLookupString() = text
|
else {
|
||||||
override fun getAllLookupStrings() = setOf(lookupString)
|
val classifier = (type.constructor.declarationDescriptor as? ClassDescriptor) ?: continue
|
||||||
|
classifier.defaultType
|
||||||
|
}
|
||||||
|
|
||||||
|
var lookupElement = lookupElementFactory.createLookupElementForType(typeToUse) ?: continue
|
||||||
|
|
||||||
|
lookupElement = object : LookupElementDecorator<LookupElement>(lookupElement) {
|
||||||
override fun renderElement(presentation: LookupElementPresentation) {
|
override fun renderElement(presentation: LookupElementPresentation) {
|
||||||
super.renderElement(presentation)
|
super.renderElement(presentation)
|
||||||
presentation.itemText = text
|
presentation.itemText += suffix
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun handleInsert(context: InsertionContext) {
|
override fun handleInsert(context: InsertionContext) {
|
||||||
super.handleInsert(context)
|
super.handleInsert(context)
|
||||||
|
|
||||||
|
PsiDocumentManager.getInstance(context.project).doPostponedOperationsAndUnblockDocument(context.document)
|
||||||
|
|
||||||
val offset = context.tailOffset
|
val offset = context.tailOffset
|
||||||
context.document.insertString(offset, suffix)
|
context.document.insertString(offset, suffix)
|
||||||
context.editor.moveCaret(offset + suffix.length)
|
context.editor.moveCaret(offset + suffix.length)
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fun<T> f(klass: Class<Array<T>>) {
|
||||||
|
}
|
||||||
|
|
||||||
|
fun g() {
|
||||||
|
f<String>(<caret>)
|
||||||
|
}
|
||||||
|
// ELEMENT: Array
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fun<T> f(klass: Class<Array<T>>) {
|
||||||
|
}
|
||||||
|
|
||||||
|
fun g() {
|
||||||
|
f<String>(Array<String>::class.java)<caret>
|
||||||
|
}
|
||||||
|
// ELEMENT: Array
|
||||||
@@ -2,4 +2,4 @@ open class A<T : Any>(val javaClass: Class<T>?)
|
|||||||
|
|
||||||
class B : A<java.io.File>(<caret>)
|
class B : A<java.io.File>(<caret>)
|
||||||
|
|
||||||
// ELEMENT: "File::class.java"
|
// ELEMENT: File
|
||||||
|
|||||||
@@ -4,4 +4,4 @@ open class A<T : Any>(val javaClass: Class<T>?)
|
|||||||
|
|
||||||
class B : A<java.io.File>(File::class.java)<caret>
|
class B : A<java.io.File>(File::class.java)<caret>
|
||||||
|
|
||||||
// ELEMENT: "File::class.java"
|
// ELEMENT: File
|
||||||
|
|||||||
@@ -4,5 +4,5 @@ fun bar() {
|
|||||||
foo<String>(<caret>)
|
foo<String>(<caret>)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ELEMENT: "String::class.java"
|
// ELEMENT: String
|
||||||
|
|
||||||
|
|||||||
@@ -4,5 +4,5 @@ fun bar() {
|
|||||||
foo<String>(String::class.java)<caret>
|
foo<String>(String::class.java)<caret>
|
||||||
}
|
}
|
||||||
|
|
||||||
// ELEMENT: "String::class.java"
|
// ELEMENT: String
|
||||||
|
|
||||||
|
|||||||
@@ -4,4 +4,4 @@ open class A<T : Any>(val kClass: KClass<T>?)
|
|||||||
|
|
||||||
class B : A<java.io.File>(<caret>)
|
class B : A<java.io.File>(<caret>)
|
||||||
|
|
||||||
// ELEMENT: "File::class"
|
// ELEMENT: File
|
||||||
|
|||||||
@@ -5,4 +5,4 @@ open class A<T : Any>(val kClass: KClass<T>?)
|
|||||||
|
|
||||||
class B : A<java.io.File>(File::class)<caret>
|
class B : A<java.io.File>(File::class)<caret>
|
||||||
|
|
||||||
// ELEMENT: "File::class"
|
// ELEMENT: File
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
import java.util.concurrent.atomic.*
|
||||||
|
|
||||||
|
fun f() {
|
||||||
|
AtomicReferenceFieldUpdater.newUpdater<String, Int>(<caret>)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ELEMENT: String
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
import java.util.concurrent.atomic.*
|
||||||
|
|
||||||
|
fun f() {
|
||||||
|
AtomicReferenceFieldUpdater.newUpdater<String, Int>(String::class.java, <caret>)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ELEMENT: String
|
||||||
+1
-1
@@ -2,4 +2,4 @@ open class A<T : Any>(val javaClass: Class<T>)
|
|||||||
|
|
||||||
class B : A<String>(<caret>)
|
class B : A<String>(<caret>)
|
||||||
|
|
||||||
// EXIST_JAVA_ONLY: { lookupString: "String::class.java", itemText: "String::class.java", attributes: "" }
|
// EXIST_JAVA_ONLY: { lookupString: "String", itemText: "String::class.java", attributes: "" }
|
||||||
|
|||||||
+1
-1
@@ -4,4 +4,4 @@ open class A<T : Any>(val kClass: KClass<T>)
|
|||||||
|
|
||||||
class B : A<String>(<caret>)
|
class B : A<String>(<caret>)
|
||||||
|
|
||||||
// EXIST: { lookupString: "String::class", itemText: "String::class", attributes: "" }
|
// EXIST: { lookupString: "String", itemText: "String::class", attributes: "" }
|
||||||
|
|||||||
Vendored
+1
-1
@@ -8,7 +8,7 @@ fun f() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// WITH_ORDER
|
// WITH_ORDER
|
||||||
// EXIST: { lookupString: "Int::class", itemText: "Int::class", attributes: "" }
|
// EXIST: { lookupString: "Int", itemText: "Int::class", attributes: "" }
|
||||||
// EXIST: { lookupString: "object" }
|
// EXIST: { lookupString: "object" }
|
||||||
// EXIST: null
|
// EXIST: null
|
||||||
// NOTHING_ELSE
|
// NOTHING_ELSE
|
||||||
|
|||||||
+12
@@ -95,6 +95,12 @@ public class SmartCompletionHandlerTestGenerated extends AbstractSmartCompletion
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("ArrayClassLiteral.kt")
|
||||||
|
public void testArrayClassLiteral() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/smart/ArrayClassLiteral.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("AutoCompleteAfterAs1.kt")
|
@TestMetadata("AutoCompleteAfterAs1.kt")
|
||||||
public void testAutoCompleteAfterAs1() throws Exception {
|
public void testAutoCompleteAfterAs1() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/smart/AutoCompleteAfterAs1.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/smart/AutoCompleteAfterAs1.kt");
|
||||||
@@ -515,6 +521,12 @@ public class SmartCompletionHandlerTestGenerated extends AbstractSmartCompletion
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt10602.kt")
|
||||||
|
public void testKt10602() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/smart/kt10602.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt6179filterTo.kt")
|
@TestMetadata("kt6179filterTo.kt")
|
||||||
public void testKt6179filterTo() throws Exception {
|
public void testKt6179filterTo() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/smart/kt6179filterTo.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/smart/kt6179filterTo.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user