diff --git a/idea/src/org/jetbrains/jet/plugin/completion/SmartCompletion.kt b/idea/src/org/jetbrains/jet/plugin/completion/SmartCompletion.kt index 1f29eeb5367..96ef59ea5ce 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/SmartCompletion.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/SmartCompletion.kt @@ -47,7 +47,7 @@ fun buildSmartCompletionData(expression: JetSimpleNameExpression, resolveSession val bindingContext = resolveSession.resolveToElement(expressionWithType) val expectedType: JetType? = bindingContext.get(BindingContext.EXPECTED_EXPRESSION_TYPE, expressionWithType) - if (expectedType == null) return null + if (expectedType == null || expectedType.isError()) return null val itemsToSkip = calcItemsToSkip(expressionWithType, resolveSession) @@ -90,7 +90,7 @@ fun buildSmartCompletionData(expression: JetSimpleNameExpression, resolveSession return object: SmartCompletionData { override fun accepts(descriptor: DeclarationDescriptor) - = !itemsToSkip.contains(descriptor) && typesOf(descriptor).any { JetTypeChecker.INSTANCE.isSubtypeOf(it, expectedType) } + = !itemsToSkip.contains(descriptor) && typesOf(descriptor).any { isSubtypeOf(it, expectedType) } override val additionalElements = additionalElements } @@ -167,7 +167,7 @@ private fun thisItems(context: JetExpression, expectedType: JetType, bindingCont for (i in 0..receivers.size - 1) { val receiver = receivers[i] val thisType = receiver.getType() - if (JetTypeChecker.INSTANCE.isSubtypeOf(thisType, expectedType)) { + if (isSubtypeOf(thisType, expectedType)) { //TODO: use this code when KT-4258 fixed //val expressionText = if (i == 0) "this" else "this@" + (thisQualifierName(receiver, bindingContext) ?: continue) val qualifier = if (i == 0) null else thisQualifierName(receiver, bindingContext) ?: continue @@ -253,7 +253,7 @@ private fun staticMembers(context: JetExpression, expectedType: JetType, resolve val descriptors = ArrayList() val isSuitableCallable: (DeclarationDescriptor) -> Boolean = { - it is CallableDescriptor && it.getReturnType()?.let { JetTypeChecker.INSTANCE.isSubtypeOf(it, expectedType) } ?: false + it is CallableDescriptor && it.getReturnType()?.let { isSubtypeOf(it, expectedType) } ?: false } if (classDescriptor is JavaClassDescriptor) { @@ -296,6 +296,10 @@ private fun staticMembers(context: JetExpression, expectedType: JetType, resolve } } +private fun isSubtypeOf(t: JetType, expectedType: JetType): Boolean{ + return !t.isError() && JetTypeChecker.INSTANCE.isSubtypeOf(t, expectedType) +} + private fun T?.toList(): List = if (this != null) listOf(this) else listOf() private fun MutableCollection.addAll(iterator: Iterator) { diff --git a/idea/testData/completion/smart/SkipUnresolvedTypes.kt b/idea/testData/completion/smart/SkipUnresolvedTypes.kt new file mode 100644 index 00000000000..b82526b03ed --- /dev/null +++ b/idea/testData/completion/smart/SkipUnresolvedTypes.kt @@ -0,0 +1,5 @@ +val x: XXX + +val v: String = + +// ABSENT: x diff --git a/idea/testData/completion/smart/UnresolvedExpectedType.kt b/idea/testData/completion/smart/UnresolvedExpectedType.kt new file mode 100644 index 00000000000..cff172bea7d --- /dev/null +++ b/idea/testData/completion/smart/UnresolvedExpectedType.kt @@ -0,0 +1,5 @@ +val x: String + +val v: XXX = + +// ABSENT: x diff --git a/idea/tests/org/jetbrains/jet/completion/JvmSmartCompletionTestGenerated.java b/idea/tests/org/jetbrains/jet/completion/JvmSmartCompletionTestGenerated.java index 5036a5f0560..0adda257811 100644 --- a/idea/tests/org/jetbrains/jet/completion/JvmSmartCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/completion/JvmSmartCompletionTestGenerated.java @@ -216,11 +216,21 @@ public class JvmSmartCompletionTestGenerated extends AbstractJvmSmartCompletionT doTest("idea/testData/completion/smart/QualifiedThisOfExtensionLambda3.kt"); } + @TestMetadata("SkipUnresolvedTypes.kt") + public void testSkipUnresolvedTypes() throws Exception { + doTest("idea/testData/completion/smart/SkipUnresolvedTypes.kt"); + } + @TestMetadata("This.kt") public void testThis() throws Exception { doTest("idea/testData/completion/smart/This.kt"); } + @TestMetadata("UnresolvedExpectedType.kt") + public void testUnresolvedExpectedType() throws Exception { + doTest("idea/testData/completion/smart/UnresolvedExpectedType.kt"); + } + @TestMetadata("VariableInitializer.kt") public void testVariableInitializer() throws Exception { doTest("idea/testData/completion/smart/VariableInitializer.kt");