diff --git a/idea/src/org/jetbrains/jet/plugin/completion/ExpectedInfos.kt b/idea/src/org/jetbrains/jet/plugin/completion/ExpectedInfos.kt index f3662fb4ad1..aaa2e5ebed0 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/ExpectedInfos.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/ExpectedInfos.kt @@ -170,7 +170,7 @@ class ExpectedInfos(val bindingContext: BindingContext, val moduleDescriptor: Mo val otherOperand = if (expressionWithType == binaryExpression.getRight()) binaryExpression.getLeft() else binaryExpression.getRight() if (otherOperand != null) { val expressionType = bindingContext[BindingContext.EXPRESSION_TYPE, otherOperand] ?: return null - return listOf(ExpectedInfo(expressionType.makeNullable(), null)) + return listOf(ExpectedInfo(expressionType, null)) } } } diff --git a/idea/src/org/jetbrains/jet/plugin/completion/smart/SmartCompletion.kt b/idea/src/org/jetbrains/jet/plugin/completion/smart/SmartCompletion.kt index b827c0ad6a5..c0b783ab41e 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/smart/SmartCompletion.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/smart/SmartCompletion.kt @@ -28,6 +28,7 @@ import java.util.* import org.jetbrains.jet.plugin.completion.* import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns import org.jetbrains.jet.plugin.util.makeNotNullable +import org.jetbrains.jet.plugin.util.makeNullable class SmartCompletion(val expression: JetSimpleNameExpression, val resolveSession: ResolveSessionForBodies, @@ -73,8 +74,14 @@ class SmartCompletion(val expression: JetSimpleNameExpression, } val allExpectedInfos = ExpectedInfos(bindingContext, moduleDescriptor).calculate(expressionWithType) ?: return null - val expectedInfos = allExpectedInfos.filter { !it.`type`.isError() } - if (expectedInfos.isEmpty()) return null + val filteredExpectedInfos = allExpectedInfos.filter { !it.`type`.isError() } + if (filteredExpectedInfos.isEmpty()) return null + + // if we complete argument of == or !=, make types in expected info's nullable to allow nullable items too + val expectedInfos = if ((expressionWithType.getParent() as? JetBinaryExpression)?.getOperationToken() in setOf(JetTokens.EQEQ, JetTokens.EXCLEQ)) + filteredExpectedInfos.map { ExpectedInfo(it.`type`.makeNullable(), it.tail) } + else + filteredExpectedInfos val result = ArrayList() @@ -112,7 +119,7 @@ class SmartCompletion(val expression: JetSimpleNameExpression, LambdaItems.addToCollection(result, functionExpectedInfos) - KeywordValues.addToCollection(result, expectedInfos, expressionWithType) + KeywordValues.addToCollection(result, filteredExpectedInfos/* use filteredExpectedInfos to not include null after == */, expressionWithType) } return result diff --git a/idea/testData/completion/smart/EqOperator.kt b/idea/testData/completion/smart/EqOperator.kt index 63f38b129ee..953d1a7412e 100644 --- a/idea/testData/completion/smart/EqOperator.kt +++ b/idea/testData/completion/smart/EqOperator.kt @@ -9,6 +9,8 @@ fun f(e1: E, e2: E?, x: Any) { // EXIST: E.A // EXIST: E.B -// EXIST: e2 +// EXIST: { itemText:"e2" } +// ABSENT: { itemText:"!! e2" } // ABSENT: e1 // ABSENT: x +// ABSENT: null