From 4e784eeb33e54465117ec72d11e2037853a23299 Mon Sep 17 00:00:00 2001 From: Dmitry Timofeev Date: Thu, 10 Mar 2022 14:18:13 +0300 Subject: [PATCH] Create INTERSECTION_TYPE stubs for definitely non-nullable types ^KTIJ-20802 Fixed --- .../DefinitelyNotNullTypes.kt | 9 ++ .../DefinitelyNotNullTypes.txt | 102 ++++++++++++++++++ .../files/ClsStubBuilderTestGenerated.java | 6 ++ .../decompiler/stub/TypeClsStubBuilder.kt | 17 ++- 4 files changed, 132 insertions(+), 2 deletions(-) create mode 100644 analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/DefinitelyNotNullTypes/DefinitelyNotNullTypes.kt create mode 100644 analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/DefinitelyNotNullTypes/DefinitelyNotNullTypes.txt diff --git a/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/DefinitelyNotNullTypes/DefinitelyNotNullTypes.kt b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/DefinitelyNotNullTypes/DefinitelyNotNullTypes.kt new file mode 100644 index 00000000000..9398bd93adc --- /dev/null +++ b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/DefinitelyNotNullTypes/DefinitelyNotNullTypes.kt @@ -0,0 +1,9 @@ +class DefinitelyNotNullTypes(private val x: T & Any) { + fun foo(xs: List): T & Any { + return if (xs.isNotEmpty()) xs[0] else x + } + + fun bar(x: R & Any, action: (R & Any) -> R & Any): R & Any { + return action(x) + } +} diff --git a/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/DefinitelyNotNullTypes/DefinitelyNotNullTypes.txt b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/DefinitelyNotNullTypes/DefinitelyNotNullTypes.txt new file mode 100644 index 00000000000..2a728b94d34 --- /dev/null +++ b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/DefinitelyNotNullTypes/DefinitelyNotNullTypes.txt @@ -0,0 +1,102 @@ +PsiJetFileStubImpl[package=] + PACKAGE_DIRECTIVE + IMPORT_LIST + CLASS[classId=/DefinitelyNotNullTypes, fqName=DefinitelyNotNullTypes, isEnumEntry=false, isInterface=false, isLocal=false, isTopLevel=true, name=DefinitelyNotNullTypes, superNames=[]] + MODIFIER_LIST[public final] + TYPE_PARAMETER_LIST + TYPE_PARAMETER[fqName=null, isInVariance=false, isOutVariance=false, name=T] + PRIMARY_CONSTRUCTOR + MODIFIER_LIST[public] + VALUE_PARAMETER_LIST + VALUE_PARAMETER[fqName=null, hasDefaultValue=false, hasValOrVar=false, isMutable=false, name=x] + TYPE_REFERENCE + INTERSECTION_TYPE + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION[referencedName=T] + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION[referencedName=Any] + CLASS_BODY + PROPERTY[fqName=DefinitelyNotNullTypes.x, hasDelegate=false, hasDelegateExpression=false, hasInitializer=false, hasReturnTypeRef=true, isExtension=false, isTopLevel=false, isVar=false, name=x] + MODIFIER_LIST[private final] + TYPE_REFERENCE + INTERSECTION_TYPE + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION[referencedName=T] + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION[referencedName=Any] + FUN[fqName=DefinitelyNotNullTypes.bar, hasBlockBody=true, hasBody=true, hasTypeParameterListBeforeFunctionName=true, isExtension=false, isTopLevel=false, mayHaveContract=false, name=bar] + MODIFIER_LIST[public final] + TYPE_PARAMETER_LIST + TYPE_PARAMETER[fqName=null, isInVariance=false, isOutVariance=false, name=R] + VALUE_PARAMETER_LIST + VALUE_PARAMETER[fqName=null, hasDefaultValue=false, hasValOrVar=false, isMutable=false, name=x] + TYPE_REFERENCE + INTERSECTION_TYPE + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION[referencedName=R] + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION[referencedName=Any] + VALUE_PARAMETER[fqName=null, hasDefaultValue=false, hasValOrVar=false, isMutable=false, name=action] + TYPE_REFERENCE + FUNCTION_TYPE + VALUE_PARAMETER_LIST + VALUE_PARAMETER[fqName=null, hasDefaultValue=false, hasValOrVar=false, isMutable=false, name=null] + TYPE_REFERENCE + INTERSECTION_TYPE + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION[referencedName=R] + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION[referencedName=Any] + TYPE_REFERENCE + INTERSECTION_TYPE + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION[referencedName=R] + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION[referencedName=Any] + TYPE_REFERENCE + INTERSECTION_TYPE + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION[referencedName=R] + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION[referencedName=Any] + FUN[fqName=DefinitelyNotNullTypes.foo, hasBlockBody=true, hasBody=true, hasTypeParameterListBeforeFunctionName=false, isExtension=false, isTopLevel=false, mayHaveContract=false, name=foo] + MODIFIER_LIST[public final] + VALUE_PARAMETER_LIST + VALUE_PARAMETER[fqName=null, hasDefaultValue=false, hasValOrVar=false, isMutable=false, name=xs] + TYPE_REFERENCE + USER_TYPE + USER_TYPE + USER_TYPE + REFERENCE_EXPRESSION[referencedName=kotlin] + REFERENCE_EXPRESSION[referencedName=collections] + REFERENCE_EXPRESSION[referencedName=List] + TYPE_ARGUMENT_LIST + TYPE_PROJECTION[projectionKind=NONE] + TYPE_REFERENCE + INTERSECTION_TYPE + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION[referencedName=T] + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION[referencedName=Any] + TYPE_REFERENCE + INTERSECTION_TYPE + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION[referencedName=T] + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION[referencedName=Any] diff --git a/analysis/decompiled/decompiler-to-file-stubs/tests/org/jetbrains/kotlin/analysis/decompiler/stub/files/ClsStubBuilderTestGenerated.java b/analysis/decompiled/decompiler-to-file-stubs/tests/org/jetbrains/kotlin/analysis/decompiler/stub/files/ClsStubBuilderTestGenerated.java index 64d70d257f3..163ab0924ef 100644 --- a/analysis/decompiled/decompiler-to-file-stubs/tests/org/jetbrains/kotlin/analysis/decompiler/stub/files/ClsStubBuilderTestGenerated.java +++ b/analysis/decompiled/decompiler-to-file-stubs/tests/org/jetbrains/kotlin/analysis/decompiler/stub/files/ClsStubBuilderTestGenerated.java @@ -108,6 +108,12 @@ public class ClsStubBuilderTestGenerated extends AbstractClsStubBuilderTest { runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/DataClass/"); } + @Test + @TestMetadata("DefinitelyNotNullTypes") + public void testDefinitelyNotNullTypes() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/DefinitelyNotNullTypes/"); + } + @Test @TestMetadata("Delegation") public void testDelegation() throws Exception { diff --git a/analysis/decompiled/decompiler-to-stubs/src/org/jetbrains/kotlin/analysis/decompiler/stub/TypeClsStubBuilder.kt b/analysis/decompiled/decompiler-to-stubs/src/org/jetbrains/kotlin/analysis/decompiler/stub/TypeClsStubBuilder.kt index d2f4ff65e33..632d23fd034 100644 --- a/analysis/decompiled/decompiler-to-stubs/src/org/jetbrains/kotlin/analysis/decompiler/stub/TypeClsStubBuilder.kt +++ b/analysis/decompiled/decompiler-to-stubs/src/org/jetbrains/kotlin/analysis/decompiler/stub/TypeClsStubBuilder.kt @@ -70,8 +70,21 @@ class TypeClsStubBuilder(private val c: ClsStubBuilderContext) { private fun createTypeParameterStub(parent: KotlinStubBaseImpl<*>, type: Type, name: Name, annotations: List) { createTypeAnnotationStubs(parent, type, annotations) - val nullableParentWrapper = nullableTypeParent(parent, type) - createStubForTypeName(ClassId.topLevel(FqName.topLevel(name)), nullableParentWrapper) + if (Flags.DEFINITELY_NOT_NULL_TYPE.get(type.flags)) { + createDefinitelyNotNullTypeStub(parent, FqName.topLevel(name)) + } else { + val nullableParentWrapper = nullableTypeParent(parent, type) + createStubForTypeName(ClassId.topLevel(FqName.topLevel(name)), nullableParentWrapper) + } + } + + private fun createDefinitelyNotNullTypeStub(parent: KotlinStubBaseImpl<*>, name: FqName) { + val intersectionType = KotlinPlaceHolderStubImpl(parent, KtStubElementTypes.INTERSECTION_TYPE) + val leftReference = KotlinPlaceHolderStubImpl(intersectionType, KtStubElementTypes.TYPE_REFERENCE) + createStubForTypeName(ClassId.topLevel(name), leftReference) + val rightReference = KotlinPlaceHolderStubImpl(intersectionType, KtStubElementTypes.TYPE_REFERENCE) + val userType = KotlinUserTypeStubImpl(rightReference) + KotlinNameReferenceExpressionStubImpl(userType, StandardNames.FqNames.any.shortName().ref()) } private fun createClassReferenceTypeStub(parent: KotlinStubBaseImpl<*>, type: Type, annotations: List) {