Fix completing members for receivers shadowed by DslMarker

#KT-20396 Fixed
This commit is contained in:
Pavel V. Talanov
2018-08-07 21:48:26 +02:00
parent 0c1d25d5ac
commit b59f134f78
12 changed files with 115 additions and 54 deletions
@@ -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
@@ -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)