Completion after "by" for top-level properties

This commit is contained in:
Valentin Kipyatkov
2016-03-31 22:31:02 +03:00
parent fe9d6aca9a
commit e18fb20d5a
3 changed files with 24 additions and 1 deletions
@@ -0,0 +1,16 @@
import kotlin.reflect.KProperty
class X
class Y
class Z
operator fun X.getValue(thisRef: Nothing?, property: KProperty<*>): String = ""
operator fun Y.getValue(thisRef: Any?, property: KProperty<*>): String = ""
operator fun Z.getValue(thisRef: Any, property: KProperty<*>): String = ""
val property by <caret>
// EXIST: lazy
// EXIST: X
// EXIST: Y
// ABSENT: Z
@@ -1540,6 +1540,12 @@ public class JvmSmartCompletionTestGenerated extends AbstractJvmSmartCompletionT
doTest(fileName);
}
@TestMetadata("TopLevelVal.kt")
public void testTopLevelVal() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/smart/propertyDelegate/TopLevelVal.kt");
doTest(fileName);
}
@TestMetadata("ValInClass.kt")
public void testValInClass() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/smart/propertyDelegate/ValInClass.kt");
@@ -33,6 +33,7 @@ import org.jetbrains.kotlin.resolve.calls.callUtil.allArgumentsMapped
import org.jetbrains.kotlin.resolve.calls.callUtil.getCall
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
import org.jetbrains.kotlin.resolve.calls.util.DelegatingCall
import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.TypeSubstitutor
@@ -611,7 +612,7 @@ class ExpectedInfos(
val scope = expressionWithType.getResolutionScope(bindingContext, resolutionFacade)
val propertyOwnerType = property.fuzzyExtensionReceiverType()
?: property.dispatchReceiverParameter?.type?.let { FuzzyType(it, emptyList()) }
?: return null
?: FuzzyType(property.builtIns.nullableNothingType, emptyList())
val explicitPropertyType = property.fuzzyReturnType()?.check { propertyDeclaration.typeReference != null }
val typesWithGetDetector = TypesWithGetValueDetector(scope, indicesHelper, propertyOwnerType, explicitPropertyType)