Fix completing members for receivers shadowed by DslMarker
#KT-20396 Fixed
This commit is contained in:
@@ -406,18 +406,15 @@ abstract class CompletionSession(
|
||||
nameExpression: KtSimpleNameExpression,
|
||||
callTypeAndReceiver: CallTypeAndReceiver<*, *>): Collection<ReceiverType>? {
|
||||
var receiverTypes = callTypeAndReceiver.receiverTypesWithIndex(
|
||||
bindingContext, nameExpression, moduleDescriptor, resolutionFacade,
|
||||
stableSmartCastsOnly = true, /* we don't include smart cast receiver types for "unstable" receiver value to mark members grayed */
|
||||
withImplicitReceiversWhenExplicitPresent = true)
|
||||
bindingContext, nameExpression, moduleDescriptor, resolutionFacade,
|
||||
stableSmartCastsOnly = true, /* we don't include smart cast receiver types for "unstable" receiver value to mark members grayed */
|
||||
withImplicitReceiversWhenExplicitPresent = true
|
||||
)
|
||||
|
||||
if (callTypeAndReceiver is CallTypeAndReceiver.SAFE || isDebuggerContext) {
|
||||
receiverTypes = receiverTypes?.map { ReceiverType(it.type.makeNotNullable(), it.receiverIndex) }
|
||||
}
|
||||
|
||||
if (receiverTypes != null && nameExpression.languageVersionSettings.supportsFeature(LanguageFeature.DslMarkersSupport)) {
|
||||
receiverTypes -= receiverTypes.shadowedByDslMarkers()
|
||||
}
|
||||
|
||||
return receiverTypes
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,5 +43,5 @@ fun test() {
|
||||
}
|
||||
}
|
||||
|
||||
// EXIST: {"lookupString":"two", "attributes":""}
|
||||
// EXIST: {"lookupString":"one", "attributes":["grayed"]}
|
||||
// EXIST: two
|
||||
// ABSENT: one
|
||||
|
||||
@@ -37,5 +37,5 @@ fun test() {
|
||||
}
|
||||
}
|
||||
|
||||
// EXIST: {"lookupString":"container", "attributes":["grayed"]}
|
||||
// EXIST: {"lookupString":"child", "attributes":["grayed"]}
|
||||
// ABSENT: container
|
||||
// ABSENT: lookupString
|
||||
@@ -42,7 +42,9 @@ class DslOtherChild {
|
||||
|
||||
@SimpleOtherDsl @SimpleDsl
|
||||
class DslAnotherChild {
|
||||
fun foo () {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
fun dsl(body: DslRoot.() -> Unit) {
|
||||
@@ -66,6 +68,7 @@ fun test() {
|
||||
}
|
||||
}
|
||||
|
||||
// EXIST: {lookupString:"otherThing", attributes:["grayed"]}
|
||||
// EXIST: {lookupString:"child", attributes:["grayed"]}
|
||||
// EXIST: {lookupString:"otherChild", attributes:["grayed"]}
|
||||
// EXIST: foo
|
||||
// ABSENT: otherThing
|
||||
// ABSENT: child
|
||||
// ABSENT: otherChild
|
||||
|
||||
@@ -34,5 +34,5 @@ fun test() {
|
||||
}
|
||||
}
|
||||
|
||||
// EXIST: {"lookupString":"child", "attributes":["bold"]}
|
||||
// EXIST: {"lookupString":"container", "attributes":["grayed"]}
|
||||
// EXIST: child
|
||||
// ABSENT: container
|
||||
@@ -0,0 +1,6 @@
|
||||
package bar
|
||||
|
||||
import baz.*
|
||||
|
||||
fun B.booExtension() {}
|
||||
fun A.booExtensionToA() {}
|
||||
@@ -0,0 +1,35 @@
|
||||
// RUNTIME
|
||||
|
||||
package baz
|
||||
|
||||
@DslMarker
|
||||
annotation class Marker
|
||||
|
||||
@Marker
|
||||
class A {
|
||||
val booFromA = ""
|
||||
|
||||
fun booFromA2() {}
|
||||
|
||||
fun section(block: B.() -> Unit) {}
|
||||
}
|
||||
|
||||
@Marker
|
||||
class B {
|
||||
fun booFromB() {}
|
||||
}
|
||||
|
||||
fun x() {
|
||||
A().apply {
|
||||
section {
|
||||
boo<caret>
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
fun booUnrelated() {
|
||||
|
||||
}
|
||||
|
||||
// ORDER: booFromB, booUnrelated, booleanArrayOf, booExtension
|
||||
+5
@@ -204,6 +204,11 @@ public class BasicCompletionWeigherTestGenerated extends AbstractBasicCompletion
|
||||
runTest("idea/idea-completion/testData/weighers/basic/SuperMembers.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("UnavailableDslReceiver.kt")
|
||||
public void testUnavailableDslReceiver() throws Exception {
|
||||
runTest("idea/idea-completion/testData/weighers/basic/UnavailableDslReceiver.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("idea/idea-completion/testData/weighers/basic/expectedInfo")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
@RunWith(JUnit3RunnerWithInners.class)
|
||||
|
||||
Reference in New Issue
Block a user