From 2d52c59bc75ceffbae1d03d672fd875ec894e4ab Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Mon, 20 Jun 2022 23:50:42 -0700 Subject: [PATCH] AA: introduce KtDynamicType --- .../descriptorBased/base/Kt1DescUtils.kt | 1 + .../descriptors/types/KtFe10DynamicType.kt | 25 ++++ ...sSourceModuleSymbolByPsiTestGenerated.java | 6 + .../analysis/api/fir/KtSymbolByFirBuilder.kt | 1 + .../api/fir/types/KtFirDynamicType.kt | 32 +++++ ...sSourceModuleSymbolByPsiTestGenerated.java | 6 + ...sSourceModuleSymbolByPsiTestGenerated.java | 6 + .../kotlin/analysis/api/types/KtType.kt | 10 ++ .../symbolByPsi/dynamic.descriptors.txt | 113 ++++++++++++++++++ .../testData/symbols/symbolByPsi/dynamic.kt | 7 ++ .../symbols/symbolByPsi/dynamic.pretty.txt | 5 + .../testData/symbols/symbolByPsi/dynamic.txt | 113 ++++++++++++++++++ 12 files changed, 325 insertions(+) create mode 100644 analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10DynamicType.kt create mode 100644 analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/KtFirDynamicType.kt create mode 100644 analysis/analysis-api/testData/symbols/symbolByPsi/dynamic.descriptors.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByPsi/dynamic.kt create mode 100644 analysis/analysis-api/testData/symbols/symbolByPsi/dynamic.pretty.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByPsi/dynamic.txt diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/Kt1DescUtils.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/Kt1DescUtils.kt index ac881a71f0f..e42f7a05dba 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/Kt1DescUtils.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/Kt1DescUtils.kt @@ -232,6 +232,7 @@ private fun T.unwrapUseSiteSubstitutionOverride(): T { internal fun KotlinType.toKtType(analysisContext: Fe10AnalysisContext): KtType { return when (val unwrappedType = unwrap()) { + is DynamicType -> KtFe10DynamicType(unwrappedType, analysisContext) is FlexibleType -> KtFe10FlexibleType(unwrappedType, analysisContext) is DefinitelyNotNullType -> KtFe10DefinitelyNotNullType(unwrappedType, analysisContext) is ErrorType -> KtFe10ClassErrorType(unwrappedType, analysisContext) diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10DynamicType.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10DynamicType.kt new file mode 100644 index 00000000000..e7b844de5f7 --- /dev/null +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10DynamicType.kt @@ -0,0 +1,25 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.api.descriptors.types + +import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktNullability +import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type +import org.jetbrains.kotlin.analysis.api.descriptors.types.base.asStringForDebugging +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion +import org.jetbrains.kotlin.analysis.api.types.KtDynamicType +import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability +import org.jetbrains.kotlin.types.DynamicType + +internal class KtFe10DynamicType( + override val type: DynamicType, + override val analysisContext: Fe10AnalysisContext +) : KtDynamicType(), KtFe10Type { + override fun asStringForDebugging(): String = withValidityAssertion { type.asStringForDebugging() } + + override val nullability: KtTypeNullability + get() = withValidityAssertion { type.ktNullability } +} diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java index e9d64d47470..6cdd24d1b22 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java @@ -112,6 +112,12 @@ public class Fe10IdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated extends A runTest("analysis/analysis-api/testData/symbols/symbolByPsi/deprecated.kt"); } + @Test + @TestMetadata("dynamic.kt") + public void testDynamic() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByPsi/dynamic.kt"); + } + @Test @TestMetadata("enum.kt") public void testEnum() throws Exception { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt index c2e39193cf1..fb86dc2642d 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt @@ -436,6 +436,7 @@ internal class KtSymbolByFirBuilder constructor( } is ConeTypeParameterType -> KtFirTypeParameterType(coneType, token, this@KtSymbolByFirBuilder) is ConeErrorType -> KtFirClassErrorType(coneType, token, this@KtSymbolByFirBuilder) + is ConeDynamicType -> KtFirDynamicType(coneType, token, this@KtSymbolByFirBuilder) is ConeFlexibleType -> KtFirFlexibleType(coneType, token, this@KtSymbolByFirBuilder) is ConeIntersectionType -> KtFirIntersectionType(coneType, token, this@KtSymbolByFirBuilder) is ConeDefinitelyNotNullType -> KtFirDefinitelyNotNullType(coneType, token, this@KtSymbolByFirBuilder) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/KtFirDynamicType.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/KtFirDynamicType.kt new file mode 100644 index 00000000000..8a9e772f860 --- /dev/null +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/KtFirDynamicType.kt @@ -0,0 +1,32 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.api.fir.types + +import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList +import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder +import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForType +import org.jetbrains.kotlin.analysis.api.fir.utils.cached +import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion +import org.jetbrains.kotlin.analysis.api.types.KtDynamicType +import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability +import org.jetbrains.kotlin.fir.types.ConeDynamicType +import org.jetbrains.kotlin.fir.types.render + +internal class KtFirDynamicType( + override val coneType: ConeDynamicType, + override val token: KtLifetimeToken, + private val builder: KtSymbolByFirBuilder, +) : KtDynamicType(), KtFirType { + override val annotationsList: KtAnnotationsList by cached { + KtFirAnnotationListForType.create(coneType, builder.rootSession, token) + } + override val nullability: KtTypeNullability get() = withValidityAssertion { coneType.nullability.asKtNullability() } + + override fun asStringForDebugging(): String = withValidityAssertion { coneType.render() } + override fun equals(other: Any?) = typeEquals(other) + override fun hashCode() = typeHashcode() +} diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java index f4fa5ae9589..73c1023226a 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java @@ -112,6 +112,12 @@ public class FirIdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated extends Ab runTest("analysis/analysis-api/testData/symbols/symbolByPsi/deprecated.kt"); } + @Test + @TestMetadata("dynamic.kt") + public void testDynamic() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByPsi/dynamic.kt"); + } + @Test @TestMetadata("enum.kt") public void testEnum() throws Exception { diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java index e48438fa684..2051211901b 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java @@ -112,6 +112,12 @@ public class FirStandaloneNormalAnalysisSourceModuleSymbolByPsiTestGenerated ext runTest("analysis/analysis-api/testData/symbols/symbolByPsi/deprecated.kt"); } + @Test + @TestMetadata("dynamic.kt") + public void testDynamic() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByPsi/dynamic.kt"); + } + @Test @TestMetadata("enum.kt") public void testEnum() throws Exception { diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/types/KtType.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/types/KtType.kt index dfbc67c0343..90471a8423c 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/types/KtType.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/types/KtType.kt @@ -107,5 +107,15 @@ public abstract class KtIntegerLiteralType : KtType { */ public abstract val possibleTypes: Collection + override fun toString(): String = asStringForDebugging() +} + +/** + * A special dynamic type, which is used to support interoperability with dynamically typed libraries, platforms or languages. + * + * Although this can be viewed as a flexible type (kotlin.Nothing..kotlin.Any?), a platform may assign special meaning to the + * values of dynamic type, and handle differently from the regular flexible type. + */ +public abstract class KtDynamicType : KtType { override fun toString(): String = asStringForDebugging() } \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/dynamic.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/dynamic.descriptors.txt new file mode 100644 index 00000000000..00a213ca551 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/dynamic.descriptors.txt @@ -0,0 +1,113 @@ +KtKotlinPropertySymbol: + annotationsList: [] + callableIdIfNonLocal: /Foo.p + getter: KtPropertyGetterSymbol() + hasBackingField: true + hasGetter: true + hasSetter: false + initializer: KtConstantInitializerValue(null) + isConst: false + isDelegatedProperty: false + isExtension: false + isFromPrimaryConstructor: false + isLateInit: false + isOverride: false + isStatic: false + isVal: true + modality: FINAL + name: p + origin: SOURCE + receiverType: null + returnType: ft + setter: null + symbolKind: CLASS_MEMBER + typeParameters: [] + visibility: Public + getDispatchReceiver(): Foo + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + getterDeprecationStatus: null + javaGetterName: getP + javaSetterName: null + setterDeprecationStatus: null + +KtValueParameterSymbol: + annotationsList: [] + callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: null + hasDefaultValue: false + isExtension: false + isImplicitLambdaParameter: false + isVararg: false + name: p + origin: SOURCE + receiverType: null + returnType: ft + symbolKind: LOCAL + typeParameters: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtAnonymousFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: null + hasStableParameterNames: true + isExtension: false + origin: SOURCE + receiverType: null + returnType: ft + symbolKind: LOCAL + typeParameters: [] + valueParameters: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /Foo.f + hasStableParameterNames: true + isBuiltinFunctionInvoke: false + isExtension: false + isExternal: false + isInfix: false + isInline: false + isOperator: false + isOverride: false + isStatic: false + isSuspend: false + modality: FINAL + name: f + origin: SOURCE + receiverType: null + returnType: ft + symbolKind: CLASS_MEMBER + typeParameters: [] + valueParameters: [ + KtValueParameterSymbol(p) + ] + visibility: Public + getDispatchReceiver(): Foo + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtNamedClassOrObjectSymbol: + annotationsList: [] + classIdIfNonLocal: Foo + classKind: CLASS + companionObject: null + isData: false + isExternal: false + isFun: false + isInline: false + isInner: false + modality: FINAL + name: Foo + origin: SOURCE + superTypes: [ + kotlin/Any + ] + symbolKind: TOP_LEVEL + typeParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/dynamic.kt b/analysis/analysis-api/testData/symbols/symbolByPsi/dynamic.kt new file mode 100644 index 00000000000..b965de2ce5f --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/dynamic.kt @@ -0,0 +1,7 @@ +class Foo { + val p : dynamic = null + + fun f(p: dynamic): dynamic { + run { "" } + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/dynamic.pretty.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/dynamic.pretty.txt new file mode 100644 index 00000000000..25d2b709230 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/dynamic.pretty.txt @@ -0,0 +1,5 @@ +class Foo { + val p: (kotlin.Nothing..kotlin.Any?) + + fun f(p: (kotlin.Nothing..kotlin.Any?)): (kotlin.Nothing..kotlin.Any?) +} diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/dynamic.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/dynamic.txt new file mode 100644 index 00000000000..f97edf24f66 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/dynamic.txt @@ -0,0 +1,113 @@ +KtKotlinPropertySymbol: + annotationsList: [] + callableIdIfNonLocal: /Foo.p + getter: KtPropertyGetterSymbol() + hasBackingField: true + hasGetter: true + hasSetter: false + initializer: KtConstantInitializerValue(null) + isConst: false + isDelegatedProperty: false + isExtension: false + isFromPrimaryConstructor: false + isLateInit: false + isOverride: false + isStatic: false + isVal: true + modality: FINAL + name: p + origin: SOURCE + receiverType: null + returnType: dynamic + setter: null + symbolKind: CLASS_MEMBER + typeParameters: [] + visibility: Public + getDispatchReceiver(): Foo + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + getterDeprecationStatus: null + javaGetterName: getP + javaSetterName: null + setterDeprecationStatus: null + +KtValueParameterSymbol: + annotationsList: [] + callableIdIfNonLocal: null + generatedPrimaryConstructorProperty: null + hasDefaultValue: false + isExtension: false + isImplicitLambdaParameter: false + isVararg: false + name: p + origin: SOURCE + receiverType: null + returnType: dynamic + symbolKind: LOCAL + typeParameters: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtAnonymousFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: null + hasStableParameterNames: true + isExtension: false + origin: SOURCE + receiverType: null + returnType: dynamic + symbolKind: LOCAL + typeParameters: [] + valueParameters: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /Foo.f + hasStableParameterNames: true + isBuiltinFunctionInvoke: false + isExtension: false + isExternal: false + isInfix: false + isInline: false + isOperator: false + isOverride: false + isStatic: false + isSuspend: false + modality: FINAL + name: f + origin: SOURCE + receiverType: null + returnType: dynamic + symbolKind: CLASS_MEMBER + typeParameters: [] + valueParameters: [ + KtValueParameterSymbol(p) + ] + visibility: Public + getDispatchReceiver(): Foo + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtNamedClassOrObjectSymbol: + annotationsList: [] + classIdIfNonLocal: Foo + classKind: CLASS + companionObject: null + isData: false + isExternal: false + isFun: false + isInline: false + isInner: false + modality: FINAL + name: Foo + origin: SOURCE + superTypes: [ + kotlin/Any + ] + symbolKind: TOP_LEVEL + typeParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null