diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java index 2ec1d4053aa..e44c6e1530a 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java @@ -130,6 +130,12 @@ public class Fe10IdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated extends runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsOnFunctionReceiverType.kt"); } + @Test + @TestMetadata("typeAnnotationsOnFunctionalTypeWithTypeAlias.kt") + public void testTypeAnnotationsOnFunctionalTypeWithTypeAlias() throws Exception { + runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsOnFunctionalTypeWithTypeAlias.kt"); + } + @Test @TestMetadata("typeAnnotationsOnPropertyGetterReturnType.kt") public void testTypeAnnotationsOnPropertyGetterReturnType() throws Exception { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java index 78fb307ae8f..ddd61256f61 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java @@ -130,6 +130,12 @@ public class FirIdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated extends runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsOnFunctionReceiverType.kt"); } + @Test + @TestMetadata("typeAnnotationsOnFunctionalTypeWithTypeAlias.kt") + public void testTypeAnnotationsOnFunctionalTypeWithTypeAlias() throws Exception { + runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsOnFunctionalTypeWithTypeAlias.kt"); + } + @Test @TestMetadata("typeAnnotationsOnPropertyGetterReturnType.kt") public void testTypeAnnotationsOnPropertyGetterReturnType() throws Exception { diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/symbols/AbstractSymbolTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/symbols/AbstractSymbolTest.kt index c18991a8aed..3e777f04baa 100644 --- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/symbols/AbstractSymbolTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/symbols/AbstractSymbolTest.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols.SymbolTest import org.jetbrains.kotlin.analysis.api.renderer.declarations.KtDeclarationRenderer import org.jetbrains.kotlin.analysis.api.renderer.declarations.impl.KtDeclarationRendererForDebug import org.jetbrains.kotlin.analysis.api.renderer.declarations.renderers.KtClassifierBodyRenderer +import org.jetbrains.kotlin.analysis.api.renderer.types.renderers.KtFunctionalTypeRenderer import org.jetbrains.kotlin.analysis.api.renderer.types.renderers.KtUsualClassTypeRenderer import org.jetbrains.kotlin.analysis.api.symbols.* import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithTypeParameters @@ -337,6 +338,7 @@ enum class PrettyRendererOption(val transformation: (KtDeclarationRenderer) -> K renderer.with { typeRenderer = typeRenderer.with { usualClassTypeRenderer = KtUsualClassTypeRenderer.AS_FULLY_EXPANDED_CLASS_TYPE_WITH_TYPE_ARGUMENTS + functionalTypeRenderer = KtFunctionalTypeRenderer.AS_FULLY_EXPANDED_CLASS_TYPE_FOR_REFELCTION_TYPES } } } diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java index 5cb2253017a..84920beeda7 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java @@ -130,6 +130,12 @@ public class FirStandaloneNormalAnalysisSourceModuleSingleSymbolByPsiGenerated e runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsOnFunctionReceiverType.kt"); } + @Test + @TestMetadata("typeAnnotationsOnFunctionalTypeWithTypeAlias.kt") + public void testTypeAnnotationsOnFunctionalTypeWithTypeAlias() throws Exception { + runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsOnFunctionalTypeWithTypeAlias.kt"); + } + @Test @TestMetadata("typeAnnotationsOnPropertyGetterReturnType.kt") public void testTypeAnnotationsOnPropertyGetterReturnType() throws Exception { diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/types/renderers/KtFunctionalTypeRenderer.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/types/renderers/KtFunctionalTypeRenderer.kt index c7ffe140993..d2e650b2eb8 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/types/renderers/KtFunctionalTypeRenderer.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/types/renderers/KtFunctionalTypeRenderer.kt @@ -71,4 +71,16 @@ public interface KtFunctionalTypeRenderer { } } + public object AS_FULLY_EXPANDED_CLASS_TYPE_FOR_REFELCTION_TYPES : KtFunctionalTypeRenderer { + context(KtAnalysisSession, KtTypeRenderer) + override fun renderType(type: KtFunctionalType, printer: PrettyPrinter) { + val fullyExpandedType = type.fullyExpandedType + if (fullyExpandedType is KtFunctionalType) { + val renderer = if (fullyExpandedType.isReflectType) AS_CLASS_TYPE else AS_FUNCTIONAL_TYPE + renderer.renderType(fullyExpandedType, printer) + } else { + renderType(fullyExpandedType, printer) + } + } + } } diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsOnFunctionalTypeWithTypeAlias.descriptors.pretty.txt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsOnFunctionalTypeWithTypeAlias.descriptors.pretty.txt new file mode 100644 index 00000000000..b408ba87488 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsOnFunctionalTypeWithTypeAlias.descriptors.pretty.txt @@ -0,0 +1 @@ +fun foo(): @Anno3 @Anno2 @Anno1 (() -> kotlin.Unit) diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsOnFunctionalTypeWithTypeAlias.descriptors.txt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsOnFunctionalTypeWithTypeAlias.descriptors.txt new file mode 100644 index 00000000000..5efda729e8f --- /dev/null +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsOnFunctionalTypeWithTypeAlias.descriptors.txt @@ -0,0 +1,41 @@ +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /foo + contextReceivers: [] + contractEffects: [] + hasStableParameterNames: true + isBuiltinFunctionInvoke: false + isExtension: false + isExternal: false + isInfix: false + isInline: false + isOperator: false + isOverride: false + isStatic: false + isSuspend: false + modality: FINAL + name: foo + origin: SOURCE + receiverParameter: null + returnType: KtFunctionalType: + annotationsList: [ + Anno3() + psi: KtAnnotationEntry + Anno2() + psi: KtAnnotationEntry + Anno1() + psi: KtAnnotationEntry + ] + ownTypeArguments: [ + KtUsualClassType: + annotationsList: [] + ownTypeArguments: [] + type: kotlin/Unit + ] + type: @R|Anno3|() @R|Anno2|() @R|Anno1|() @R|Anno3|() SecondTypeAlias + symbolKind: TOP_LEVEL + typeParameters: [] + valueParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsOnFunctionalTypeWithTypeAlias.kt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsOnFunctionalTypeWithTypeAlias.kt new file mode 100644 index 00000000000..30e31b59402 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsOnFunctionalTypeWithTypeAlias.kt @@ -0,0 +1,13 @@ +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1 +// PRETTY_RENDERER_OPTION: FULLY_EXPANDED_TYPES +@Target(AnnotationTarget.TYPE) +annotation class Anno1 +@Target(AnnotationTarget.TYPE) +annotation class Anno2 +@Target(AnnotationTarget.TYPE) +annotation class Anno3 + +typealias FirstTypeAlias = @Anno1 (() -> Unit) +typealias SecondTypeAlias = @Anno2 FirstTypeAlias + +fun foo(): @Anno3 SecondTypeAlias = {} diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsOnFunctionalTypeWithTypeAlias.pretty.txt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsOnFunctionalTypeWithTypeAlias.pretty.txt new file mode 100644 index 00000000000..63092a4e81a --- /dev/null +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsOnFunctionalTypeWithTypeAlias.pretty.txt @@ -0,0 +1 @@ +fun foo(): @Anno1 @Anno2 @Anno3 (() -> kotlin.Unit) diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsOnFunctionalTypeWithTypeAlias.txt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsOnFunctionalTypeWithTypeAlias.txt new file mode 100644 index 00000000000..19c00cc5460 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsOnFunctionalTypeWithTypeAlias.txt @@ -0,0 +1,41 @@ +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /foo + contextReceivers: [] + contractEffects: [] + hasStableParameterNames: true + isBuiltinFunctionInvoke: false + isExtension: false + isExternal: false + isInfix: false + isInline: false + isOperator: false + isOverride: false + isStatic: false + isSuspend: false + modality: FINAL + name: foo + origin: SOURCE + receiverParameter: null + returnType: KtFunctionalType: + annotationsList: [ + Anno1() + psi: KtAnnotationEntry + Anno2() + psi: KtAnnotationEntry + Anno3() + psi: KtAnnotationEntry + ] + ownTypeArguments: [ + KtUsualClassType: + annotationsList: [] + ownTypeArguments: [] + type: kotlin/Unit + ] + type: @R|Anno1|() @R|Anno2|() @R|Anno3|() kotlin/Function0 + symbolKind: TOP_LEVEL + typeParameters: [] + valueParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirTypeResolverImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirTypeResolverImpl.kt index 0c3491e1952..8e54db3c33f 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirTypeResolverImpl.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirTypeResolverImpl.kt @@ -443,7 +443,10 @@ class FirTypeResolverImpl(private val session: FirSession) : FirTypeResolver() { } } - private fun createFunctionType(typeRef: FirFunctionTypeRef): Pair { + private fun createFunctionType( + typeRef: FirFunctionTypeRef, + containerDeclaration: FirDeclaration? = null + ): Pair { val parameters = typeRef.contextReceiverTypeRefs.map { it.coneType } + listOfNotNull(typeRef.receiverTypeRef?.coneType) + @@ -472,7 +475,8 @@ class FirTypeResolverImpl(private val session: FirSession) : FirTypeResolver() { if (typeRef.contextReceiverTypeRefs.isNotEmpty()) { add(CompilerConeAttributes.ContextFunctionTypeParams(typeRef.contextReceiverTypeRefs.size)) } - } + }, + containerDeclaration ) return ConeClassLikeTypeImpl( classId.toLookupTag(), @@ -503,7 +507,7 @@ class FirTypeResolverImpl(private val session: FirSession) : FirTypeResolver() { isOperandOfIsOperator, ) to (result as? TypeResolutionResult.Resolved)?.typeCandidate?.diagnostic } - is FirFunctionTypeRef -> createFunctionType(typeRef) + is FirFunctionTypeRef -> createFunctionType(typeRef, scopeClassDeclaration.containerDeclaration) is FirDynamicTypeRef -> ConeDynamicType.create(session) to null is FirIntersectionTypeRef -> { val leftType = typeRef.leftType.coneType