KT-18538 Unwrap fake override in ShortenReferences
- Fake override prevents reference shortener from shortening of static methods declared in the class bases when they are located not in direct parent of the class (for example, in grand- or grand-grand-parent) - The completion uses descriptor with unwrapped fake override when it performs the insertion. It leads to inserting the name of the base which actually contains the static method instead of the direct parent class. Now, when reference shortener compares unwrapped descriptors, this problem should be fixed during insertion handling
This commit is contained in:
+2
-4
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.idea.completion.handlers.KotlinClassifierInsertHandl
|
||||
import org.jetbrains.kotlin.idea.completion.handlers.KotlinFunctionInsertHandler
|
||||
import org.jetbrains.kotlin.idea.core.completion.DeclarationLookupObject
|
||||
import org.jetbrains.kotlin.idea.core.completion.PackageLookupObject
|
||||
import org.jetbrains.kotlin.idea.core.unwrapIfFakeOverride
|
||||
import org.jetbrains.kotlin.idea.highlighter.dsl.DslHighlighterExtension
|
||||
import org.jetbrains.kotlin.load.java.JvmAbi
|
||||
import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor
|
||||
@@ -51,10 +52,7 @@ class BasicLookupElementFactory(
|
||||
includeClassTypeArguments: Boolean = true,
|
||||
parametersAndTypeGrayed: Boolean = false
|
||||
): LookupElement {
|
||||
val _descriptor = if (descriptor is CallableMemberDescriptor)
|
||||
DescriptorUtils.unwrapFakeOverride(descriptor)
|
||||
else
|
||||
descriptor
|
||||
val _descriptor = descriptor.unwrapIfFakeOverride()
|
||||
return createLookupElementUnwrappedDescriptor(_descriptor, qualifyNestedClasses, includeClassTypeArguments, parametersAndTypeGrayed)
|
||||
}
|
||||
|
||||
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
public class Base extends GrandBase {
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
class Inheritor : Base() {
|
||||
init {
|
||||
fooBa<caret>
|
||||
}
|
||||
}
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
public class GrandBase {
|
||||
public static void fooBar() {}
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
class Inheritor : Base() {
|
||||
init {
|
||||
fooBar()
|
||||
}
|
||||
}
|
||||
+10
-1
@@ -30,6 +30,10 @@ class CompletionMultiFileHandlerTest : KotlinCompletionTestCase() {
|
||||
doTest()
|
||||
}
|
||||
|
||||
fun testStaticMethodFromGrandParent() {
|
||||
doTest('\n', "StaticMethodFromGrandParent-1.java", "StaticMethodFromGrandParent-2.java")
|
||||
}
|
||||
|
||||
fun testTopLevelFunctionImport() {
|
||||
doTest()
|
||||
}
|
||||
@@ -113,8 +117,13 @@ class CompletionMultiFileHandlerTest : KotlinCompletionTestCase() {
|
||||
fun doTest(completionChar: Char = '\n', vararg extraFileNames: String, tailText: String? = null) {
|
||||
val fileName = getTestName(false)
|
||||
|
||||
val defaultFiles = listOf("$fileName-1.kt", "$fileName-2.kt")
|
||||
val filteredFiles = defaultFiles.filter { File(testDataPath, it).exists() }
|
||||
|
||||
require(filteredFiles.isNotEmpty()) { "At least one of $defaultFiles should exist!" }
|
||||
|
||||
configureByFiles(null, *extraFileNames)
|
||||
configureByFiles(null, "$fileName-1.kt", "$fileName-2.kt")
|
||||
configureByFiles(null, *filteredFiles.toTypedArray())
|
||||
complete(2)
|
||||
if (myItems != null) {
|
||||
val item = if (tailText == null)
|
||||
|
||||
Reference in New Issue
Block a user