"true" and "false" in smart completion when Boolean? expected
This commit is contained in:
@@ -903,6 +903,10 @@ public class KotlinBuiltIns {
|
|||||||
return isConstructedFromGivenClassAndNotNullable(type, FQ_NAMES._boolean);
|
return isConstructedFromGivenClassAndNotNullable(type, FQ_NAMES._boolean);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isBooleanOrNullableBoolean(@NotNull JetType type) {
|
||||||
|
return isConstructedFromGivenClass(type, FQ_NAMES._boolean);
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean isBoolean(@NotNull ClassDescriptor classDescriptor) {
|
public static boolean isBoolean(@NotNull ClassDescriptor classDescriptor) {
|
||||||
return FQ_NAMES._boolean.equals(getFqName(classDescriptor));
|
return FQ_NAMES._boolean.equals(getFqName(classDescriptor));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,12 +22,12 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
|||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
|
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
|
||||||
import org.jetbrains.kotlin.resolve.scopes.SubstitutingScope
|
|
||||||
import org.jetbrains.kotlin.types.*
|
import org.jetbrains.kotlin.types.*
|
||||||
import org.jetbrains.kotlin.types.checker.JetTypeChecker
|
import org.jetbrains.kotlin.types.checker.JetTypeChecker
|
||||||
import org.jetbrains.kotlin.utils.toReadOnlyList
|
import org.jetbrains.kotlin.utils.toReadOnlyList
|
||||||
import java.util.*
|
import java.util.ArrayDeque
|
||||||
|
import java.util.ArrayList
|
||||||
|
import java.util.LinkedHashSet
|
||||||
|
|
||||||
public enum class TypeNullability {
|
public enum class TypeNullability {
|
||||||
NOT_NULL,
|
NOT_NULL,
|
||||||
@@ -53,6 +53,7 @@ fun JetType.isNothing(): Boolean = KotlinBuiltIns.isNothing(this)
|
|||||||
fun JetType.isUnit(): Boolean = KotlinBuiltIns.isUnit(this)
|
fun JetType.isUnit(): Boolean = KotlinBuiltIns.isUnit(this)
|
||||||
fun JetType.isAnyOrNullableAny(): Boolean = KotlinBuiltIns.isAnyOrNullableAny(this)
|
fun JetType.isAnyOrNullableAny(): Boolean = KotlinBuiltIns.isAnyOrNullableAny(this)
|
||||||
fun JetType.isBoolean(): Boolean = KotlinBuiltIns.isBoolean(this)
|
fun JetType.isBoolean(): Boolean = KotlinBuiltIns.isBoolean(this)
|
||||||
|
fun JetType.isBooleanOrNullableBoolean(): Boolean = KotlinBuiltIns.isBooleanOrNullableBoolean(this)
|
||||||
|
|
||||||
private fun JetType.getContainedTypeParameters(): Collection<TypeParameterDescriptor> {
|
private fun JetType.getContainedTypeParameters(): Collection<TypeParameterDescriptor> {
|
||||||
val declarationDescriptor = getConstructor().getDeclarationDescriptor()
|
val declarationDescriptor = getConstructor().getDeclarationDescriptor()
|
||||||
|
|||||||
@@ -45,7 +45,6 @@ import org.jetbrains.kotlin.resolve.DescriptorUtils
|
|||||||
import org.jetbrains.kotlin.resolve.inline.InlineUtil
|
import org.jetbrains.kotlin.resolve.inline.InlineUtil
|
||||||
import org.jetbrains.kotlin.types.JetType
|
import org.jetbrains.kotlin.types.JetType
|
||||||
import org.jetbrains.kotlin.types.typeUtil.TypeNullability
|
import org.jetbrains.kotlin.types.typeUtil.TypeNullability
|
||||||
import org.jetbrains.kotlin.types.typeUtil.makeNotNullable
|
|
||||||
import org.jetbrains.kotlin.types.typeUtil.nullability
|
import org.jetbrains.kotlin.types.typeUtil.nullability
|
||||||
import java.util.ArrayList
|
import java.util.ArrayList
|
||||||
|
|
||||||
@@ -204,7 +203,7 @@ fun returnExpressionItems(bindingContext: BindingContext, position: JetElement):
|
|||||||
if (returnType != null && returnType.nullability() == TypeNullability.NULLABLE) {
|
if (returnType != null && returnType.nullability() == TypeNullability.NULLABLE) {
|
||||||
result.add(createKeywordWithLabelElement("return null", null, addSpace = false))
|
result.add(createKeywordWithLabelElement("return null", null, addSpace = false))
|
||||||
}
|
}
|
||||||
if (returnType != null && KotlinBuiltIns.isBoolean(returnType.makeNotNullable())) {
|
if (returnType != null && KotlinBuiltIns.isBooleanOrNullableBoolean(returnType)) {
|
||||||
result.add(createKeywordWithLabelElement("return true", null, addSpace = false))
|
result.add(createKeywordWithLabelElement("return true", null, addSpace = false))
|
||||||
result.add(createKeywordWithLabelElement("return false", null, addSpace = false))
|
result.add(createKeywordWithLabelElement("return false", null, addSpace = false))
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -20,13 +20,13 @@ import com.intellij.codeInsight.completion.InsertionContext
|
|||||||
import com.intellij.codeInsight.lookup.LookupElement
|
import com.intellij.codeInsight.lookup.LookupElement
|
||||||
import com.intellij.codeInsight.lookup.LookupElementBuilder
|
import com.intellij.codeInsight.lookup.LookupElementBuilder
|
||||||
import com.intellij.codeInsight.lookup.LookupElementDecorator
|
import com.intellij.codeInsight.lookup.LookupElementDecorator
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
|
||||||
import org.jetbrains.kotlin.idea.completion.COMPARISON_TOKENS
|
import org.jetbrains.kotlin.idea.completion.COMPARISON_TOKENS
|
||||||
import org.jetbrains.kotlin.idea.completion.ExpectedInfo
|
import org.jetbrains.kotlin.idea.completion.ExpectedInfo
|
||||||
import org.jetbrains.kotlin.idea.completion.fuzzyType
|
import org.jetbrains.kotlin.idea.completion.fuzzyType
|
||||||
import org.jetbrains.kotlin.idea.completion.handlers.WithTailInsertHandler
|
import org.jetbrains.kotlin.idea.completion.handlers.WithTailInsertHandler
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.types.TypeSubstitutor
|
import org.jetbrains.kotlin.types.TypeSubstitutor
|
||||||
|
import org.jetbrains.kotlin.types.typeUtil.isBooleanOrNullableBoolean
|
||||||
|
|
||||||
object KeywordValues {
|
object KeywordValues {
|
||||||
public fun addToCollection(collection: MutableCollection<LookupElement>, expectedInfos: Collection<ExpectedInfo>, expressionWithType: JetExpression) {
|
public fun addToCollection(collection: MutableCollection<LookupElement>, expectedInfos: Collection<ExpectedInfo>, expressionWithType: JetExpression) {
|
||||||
@@ -52,7 +52,7 @@ object KeywordValues {
|
|||||||
|
|
||||||
if (!skipTrueFalse) {
|
if (!skipTrueFalse) {
|
||||||
val booleanInfoClassifier = { info: ExpectedInfo ->
|
val booleanInfoClassifier = { info: ExpectedInfo ->
|
||||||
if (info.fuzzyType?.type == KotlinBuiltIns.getInstance().getBooleanType()) ExpectedInfoClassification.match(TypeSubstitutor.EMPTY) else ExpectedInfoClassification.noMatch
|
if (info.fuzzyType?.type?.isBooleanOrNullableBoolean() ?: false) ExpectedInfoClassification.match(TypeSubstitutor.EMPTY) else ExpectedInfoClassification.noMatch
|
||||||
}
|
}
|
||||||
collection.addLookupElements(null, expectedInfos, booleanInfoClassifier) { LookupElementBuilder.create("true").bold().assignSmartCompletionPriority(SmartCompletionItemPriority.TRUE) }
|
collection.addLookupElements(null, expectedInfos, booleanInfoClassifier) { LookupElementBuilder.create("true").bold().assignSmartCompletionPriority(SmartCompletionItemPriority.TRUE) }
|
||||||
collection.addLookupElements(null, expectedInfos, booleanInfoClassifier) { LookupElementBuilder.create("false").bold().assignSmartCompletionPriority(SmartCompletionItemPriority.FALSE) }
|
collection.addLookupElements(null, expectedInfos, booleanInfoClassifier) { LookupElementBuilder.create("false").bold().assignSmartCompletionPriority(SmartCompletionItemPriority.FALSE) }
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
fun foo(): Boolean? = <caret>
|
||||||
|
|
||||||
|
// EXIST: { itemText: "true", attributes: "bold" }
|
||||||
|
// EXIST: { itemText: "false", attributes: "bold" }
|
||||||
|
// EXIST: { itemText: "null", attributes: "bold" }
|
||||||
+6
@@ -359,6 +359,12 @@ public class JvmSmartCompletionTestGenerated extends AbstractJvmSmartCompletionT
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("NullableBooleanExpected.kt")
|
||||||
|
public void testNullableBooleanExpected() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/smart/NullableBooleanExpected.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("Object.kt")
|
@TestMetadata("Object.kt")
|
||||||
public void testObject() throws Exception {
|
public void testObject() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/smart/Object.kt");
|
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/smart/Object.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user