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 e44c6e1530a..ae56f26d0a4 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 @@ -118,6 +118,12 @@ public class Fe10IdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated extends runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/setterWithAnnotations.kt"); } + @Test + @TestMetadata("typeAnnotationWithArgument.kt") + public void testTypeAnnotationWithArgument() throws Exception { + runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationWithArgument.kt"); + } + @Test @TestMetadata("typeAnnotationsOnFunctionParameterType.kt") public void testTypeAnnotationsOnFunctionParameterType() throws Exception { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/FirCallableSignature.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/FirCallableSignature.kt index 526e6a3e671..18e3a04564d 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/FirCallableSignature.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/FirCallableSignature.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2023 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. */ @@ -8,11 +8,13 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.FirResolvePhase +import org.jetbrains.kotlin.fir.renderer.ConeAttributeRenderer import org.jetbrains.kotlin.fir.renderer.ConeIdFullRenderer import org.jetbrains.kotlin.fir.renderer.ConeTypeRenderer import org.jetbrains.kotlin.fir.renderer.FirRenderer import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase +import org.jetbrains.kotlin.fir.types.ConeAttributes import org.jetbrains.kotlin.fir.types.FirTypeRef /** @@ -76,7 +78,7 @@ internal class FirCallableSignature private constructor( fun createSignature(callableSymbol: FirCallableSymbol<*>): FirCallableSignature = createSignature(callableSymbol.fir) fun createSignature(callableDeclaration: FirCallableDeclaration): FirCallableSignature { - callableDeclaration.lazyResolveToPhase(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) + callableDeclaration.lazyResolveToPhase(FirResolvePhase.TYPES) return FirCallableSignature( receiverType = callableDeclaration.receiverParameter?.typeRef?.renderType(), @@ -87,13 +89,14 @@ internal class FirCallableSignature private constructor( null }, typeParametersCount = callableDeclaration.typeParameters.size, - returnType = callableDeclaration.returnTypeRef.renderType(), + returnType = callableDeclaration.symbol.resolvedReturnTypeRef.renderType(), ) } } } -private fun FirTypeRef.renderType(): String = FirRenderer( +private fun FirTypeRef.renderType(builder: StringBuilder = StringBuilder()): String = FirRenderer( + builder = builder, annotationRenderer = null, bodyRenderer = null, callArgumentsRenderer = null, @@ -105,7 +108,11 @@ private fun FirTypeRef.renderType(): String = FirRenderer( packageDirectiveRenderer = null, propertyAccessorRenderer = null, resolvePhaseRenderer = null, - typeRenderer = ConeTypeRenderer(), + typeRenderer = ConeTypeRenderer().apply { attributeRenderer = EmptyConeTypeAttributeRenderer }, valueParameterRenderer = null, errorExpressionRenderer = null, ).renderElementAsString(this) + +private object EmptyConeTypeAttributeRenderer : ConeAttributeRenderer() { + override fun render(attributes: ConeAttributes): String = "" +} 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 ddd61256f61..96f6cf774aa 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 @@ -118,6 +118,12 @@ public class FirIdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated extends runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/setterWithAnnotations.kt"); } + @Test + @TestMetadata("typeAnnotationWithArgument.kt") + public void testTypeAnnotationWithArgument() throws Exception { + runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationWithArgument.kt"); + } + @Test @TestMetadata("typeAnnotationsOnFunctionParameterType.kt") public void testTypeAnnotationsOnFunctionParameterType() throws Exception { 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 84920beeda7..3ea2fb55873 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 @@ -118,6 +118,12 @@ public class FirStandaloneNormalAnalysisSourceModuleSingleSymbolByPsiGenerated e runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/setterWithAnnotations.kt"); } + @Test + @TestMetadata("typeAnnotationWithArgument.kt") + public void testTypeAnnotationWithArgument() throws Exception { + runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationWithArgument.kt"); + } + @Test @TestMetadata("typeAnnotationsOnFunctionParameterType.kt") public void testTypeAnnotationsOnFunctionParameterType() throws Exception { diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationWithArgument.kt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationWithArgument.kt new file mode 100644 index 00000000000..038abbec24a --- /dev/null +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationWithArgument.kt @@ -0,0 +1,5 @@ +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1 +@Target(AnnotationTarget.TYPE) +annotation class Anno5(val s: String) + +fun foo(): List<@Anno5("1") Int>? = null diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationWithArgument.pretty.txt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationWithArgument.pretty.txt new file mode 100644 index 00000000000..f8dc8500eb0 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationWithArgument.pretty.txt @@ -0,0 +1 @@ +fun foo(): kotlin.collections.List<@Anno5(s = "1") kotlin.Int>? \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationWithArgument.txt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationWithArgument.txt new file mode 100644 index 00000000000..f830e15de4f --- /dev/null +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationWithArgument.txt @@ -0,0 +1,37 @@ +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: KtUsualClassType: + annotationsList: [] + ownTypeArguments: [ + KtUsualClassType: + annotationsList: [ + Anno5(s = "1") + psi: KtAnnotationEntry + ] + ownTypeArguments: [] + type: @R|Anno5|(s = String(1)) kotlin/Int + ] + type: kotlin/collections/List<@R|Anno5|(s = String(1)) kotlin/Int>? + symbolKind: TOP_LEVEL + typeParameters: [] + valueParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null \ No newline at end of file diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeAttributeRenderer.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeAttributeRenderer.kt new file mode 100644 index 00000000000..8669f21daf1 --- /dev/null +++ b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeAttributeRenderer.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2010-2023 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.fir.renderer + +import org.jetbrains.kotlin.fir.types.ConeAttributes + +abstract class ConeAttributeRenderer { + abstract fun render(attributes: ConeAttributes): String + + object ToString : ConeAttributeRenderer() { + override fun render(attributes: ConeAttributes): String = attributes.joinToString(separator = " ", postfix = " ") { it.toString() } + } +} diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeTypeRenderer.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeTypeRenderer.kt index bf02788e87f..4a3b5f3ca27 100644 --- a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeTypeRenderer.kt +++ b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/renderer/ConeTypeRenderer.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2023 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. */ @@ -12,6 +12,7 @@ open class ConeTypeRenderer { lateinit var builder: StringBuilder lateinit var idRenderer: ConeIdRenderer + var attributeRenderer: ConeAttributeRenderer = ConeAttributeRenderer.ToString open fun renderAsPossibleFunctionType( type: ConeKotlinType, @@ -180,7 +181,7 @@ open class ConeTypeRenderer { private fun ConeKotlinType.renderAttributes() { if (!attributes.any()) return - builder.append(attributes.joinToString(" ", postfix = " ") { it.toString() }) + builder.append(attributeRenderer.render(attributes)) } private fun ConeTypeProjection.render() {