From 37760d1f2ab80cd8f98f9709eed12bc5326ff5c5 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Mon, 27 Feb 2023 19:55:36 +0900 Subject: [PATCH] [Analysis API] Support script declarations (KTIJ-21108) --- .../components/KtFe10SymbolProvider.kt | 4 ++ .../symbols/psiBased/KtFe10PsiScriptSymbol.kt | 52 +++++++++++++++++++ .../analysis/api/fir/KtSymbolByFirBuilder.kt | 3 ++ ...tFirSymbolContainingDeclarationProvider.kt | 6 +-- .../api/fir/symbols/KtFirScriptSymbol.kt | 51 ++++++++++++++++++ .../api/fir/symbols/KtFirSymbolProvider.kt | 5 ++ .../declarations/KtDeclarationRenderer.kt | 12 +++++ .../bodies/KtScriptInitializerRenderer.kt | 22 ++++++++ .../impl/KtDeclarationRendererForSource.kt | 3 ++ .../callables/KtScriptSymbolRenderer.kt | 23 ++++++++ .../analysis/api/symbols/KtScriptSymbol.kt | 16 ++++++ .../analysis/api/symbols/KtSymbolProvider.kt | 2 + 12 files changed, 196 insertions(+), 3 deletions(-) create mode 100644 analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiScriptSymbol.kt create mode 100644 analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirScriptSymbol.kt create mode 100644 analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/bodies/KtScriptInitializerRenderer.kt create mode 100644 analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/callables/KtScriptSymbolRenderer.kt create mode 100644 analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtScriptSymbol.kt diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SymbolProvider.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SymbolProvider.kt index 9dbcc4b9c23..62f3e337f45 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SymbolProvider.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SymbolProvider.kt @@ -37,6 +37,10 @@ internal class KtFe10SymbolProvider( return KtFe10FileSymbol(psi, analysisContext) } + override fun getScriptSymbol(psi: KtScript): KtScriptSymbol { + return KtFe10PsiScriptSymbol(psi, analysisContext) + } + override fun getParameterSymbol(psi: KtParameter): KtVariableLikeSymbol { return when { psi.isFunctionTypeParameter -> error("Function type parameters are not supported in getParameterSymbol()") diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiScriptSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiScriptSymbol.kt new file mode 100644 index 00000000000..46e93edb912 --- /dev/null +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiScriptSymbol.kt @@ -0,0 +1,52 @@ +/* + * 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.analysis.api.descriptors.symbols.psiBased + +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext +import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisFacade +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10AnnotatedSymbol +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.KtFe10PsiSymbol +import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion +import org.jetbrains.kotlin.analysis.api.symbols.KtScriptSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin +import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer +import org.jetbrains.kotlin.descriptors.ScriptDescriptor +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.psi.KtScript +import org.jetbrains.kotlin.resolve.BindingContext + +internal class KtFe10PsiScriptSymbol( + private val script: KtScript, + override val analysisContext: Fe10AnalysisContext +) : KtScriptSymbol(), KtFe10AnnotatedSymbol, KtFe10PsiSymbol { + override val descriptor: ScriptDescriptor? by cached { + val bindingContext = analysisContext.analyze(psi, Fe10AnalysisFacade.AnalysisMode.PARTIAL) + bindingContext[BindingContext.SCRIPT, psi] + } + + override val origin: KtSymbolOrigin + get() = withValidityAssertion { if (script.containingKtFile.isCompiled) KtSymbolOrigin.LIBRARY else KtSymbolOrigin.SOURCE } + + override val psi: KtScript + get() = withValidityAssertion { script } + + override val name: Name + get() = withValidityAssertion { script.nameAsSafeName } + + override val typeParameters: List + get() = withValidityAssertion { emptyList() } + + context(KtAnalysisSession) + override fun createPointer(): KtSymbolPointer = withValidityAssertion { + KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer() + } +} \ No newline at end of file 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 0fb5087d944..47650be4564 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 @@ -94,6 +94,7 @@ internal class KtSymbolByFirBuilder constructor( is FirTypeParameterSymbol -> classifierBuilder.buildTypeParameterSymbol(firSymbol) is FirCallableSymbol<*> -> callableBuilder.buildCallableSymbol(firSymbol) is FirFileSymbol -> buildFileSymbol(firSymbol) + is FirScriptSymbol -> buildScriptSymbol(firSymbol) else -> throwUnexpectedElementError(firSymbol) } } @@ -103,6 +104,8 @@ internal class KtSymbolByFirBuilder constructor( fun buildFileSymbol(firSymbol: FirFileSymbol) = KtFirFileSymbol(firSymbol, analysisSession) + fun buildScriptSymbol(firSymbol: FirScriptSymbol) = KtFirScriptSymbol(firSymbol, analysisSession) + private val packageProvider = project.createPackageProvider(GlobalSearchScope.allScope(project))//todo scope fun createPackageSymbolIfOneExists(packageFqName: FqName): KtFirPackageSymbol? { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt index e0067d3c3eb..2ae6c118a23 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt @@ -45,7 +45,9 @@ internal class KtFirSymbolContainingDeclarationProvider( is KtLocalVariableSymbol -> getParentSymbolByPsi() is KtAnonymousFunctionSymbol -> getParentSymbolByPsi() is KtAnonymousObjectSymbol -> getParentSymbolByPsi() - is KtSamConstructorSymbol -> null // SAM constructors are always toplevel + + is KtSamConstructorSymbol -> null // SAM constructors are always top-level + is KtScriptSymbol -> null // Scripts are always top-level is KtClassInitializerSymbol -> { val outerFirClassifier = symbol.firSymbol.getContainingClassSymbol(symbol.firSymbol.llFirSession) @@ -69,8 +71,6 @@ internal class KtFirSymbolContainingDeclarationProvider( val outerFirClassifier = symbol.firSymbol.llFirSession.firProvider.getFirClassifierByFqName(outerClassId) ?: return null firSymbolBuilder.buildSymbol(outerFirClassifier) as? KtDeclarationSymbol } - - } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirScriptSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirScriptSymbol.kt new file mode 100644 index 00000000000..70c106da3e6 --- /dev/null +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirScriptSymbol.kt @@ -0,0 +1,51 @@ +/* + * 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.analysis.api.fir.symbols + +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession +import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration +import org.jetbrains.kotlin.analysis.api.fir.utils.cached +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion +import org.jetbrains.kotlin.analysis.api.symbols.KtScriptSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer +import org.jetbrains.kotlin.fir.symbols.impl.FirScriptSymbol +import org.jetbrains.kotlin.fir.psi +import org.jetbrains.kotlin.name.Name + +internal class KtFirScriptSymbol( + override val firSymbol: FirScriptSymbol, + override val analysisSession: KtFirAnalysisSession +) : KtScriptSymbol(), KtFirSymbol { + override val psi: PsiElement? + get() = withValidityAssertion { firSymbol.fir.psi } + + override val annotationsList by cached { + KtFirAnnotationListForDeclaration.create( + firSymbol, + analysisSession.useSiteSession, + token, + ) + } + + override val typeParameters: List + get() = withValidityAssertion { emptyList() } + + override val name: Name + get() = withValidityAssertion { firSymbol.fir.name } + + context(KtAnalysisSession) + override fun createPointer(): KtSymbolPointer = withValidityAssertion { + KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } + TODO("Creating pointers for files from library is not supported yet") + } + + override fun equals(other: Any?): Boolean = symbolEquals(other) + override fun hashCode(): Int = symbolHashCode() +} \ No newline at end of file diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbolProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbolProvider.kt index 38bfd76d481..127248da896 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbolProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbolProvider.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.components.KtFirAnalysisSessionComponent import org.jetbrains.kotlin.analysis.api.symbols.* +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirFile import org.jetbrains.kotlin.analysis.low.level.api.fir.api.resolveToFirSymbolOfType import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecificEntries @@ -54,6 +55,10 @@ internal class KtFirSymbolProvider( return firSymbolBuilder.buildFileSymbol(psi.getOrBuildFirFile(firResolveSession).symbol) } + override fun getScriptSymbol(psi: KtScript): KtScriptSymbol { + return firSymbolBuilder.buildScriptSymbol(psi.resolveToFirSymbolOfType(firResolveSession)) + } + override fun getFunctionLikeSymbol(psi: KtNamedFunction): KtFunctionLikeSymbol { return when (val firSymbol = psi.resolveToFirSymbolOfType>(firResolveSession)) { is FirNamedFunctionSymbol -> { diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/KtDeclarationRenderer.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/KtDeclarationRenderer.kt index ea245890204..4c257c68e9e 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/KtDeclarationRenderer.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/KtDeclarationRenderer.kt @@ -81,6 +81,9 @@ public class KtDeclarationRenderer private constructor( public val anonymousObjectRenderer: KtAnonymousObjectSymbolRenderer, public val singleTypeParameterRenderer: KtSingleTypeParameterSymbolRenderer, public val returnTypeFilter: KtCallableReturnTypeFilter, + + public val scriptRenderer: KtScriptSymbolRenderer, + public val scriptInitializerRenderer: KtScriptInitializerRenderer ) { context(KtAnalysisSession) @@ -104,6 +107,7 @@ public class KtDeclarationRenderer private constructor( is KtSyntheticJavaPropertySymbol -> syntheticJavaPropertyRenderer.renderSymbol(symbol, printer) is KtTypeParameterSymbol -> singleTypeParameterRenderer.renderSymbol(symbol, printer) is KtClassInitializerSymbol -> classInitializerRender.renderClassInitializer(symbol, printer) + is KtScriptSymbol -> scriptRenderer.renderSymbol(symbol, printer) } } @@ -165,6 +169,9 @@ public class KtDeclarationRenderer private constructor( this.singleTypeParameterRenderer = renderer.singleTypeParameterRenderer this.returnTypeFilter = renderer.returnTypeFilter + this.scriptRenderer = renderer.scriptRenderer + this.scriptInitializerRenderer = renderer.scriptInitializerRenderer + action() } } @@ -229,6 +236,8 @@ public class KtDeclarationRenderer private constructor( public lateinit var anonymousObjectRenderer: KtAnonymousObjectSymbolRenderer public lateinit var singleTypeParameterRenderer: KtSingleTypeParameterSymbolRenderer + public lateinit var scriptRenderer: KtScriptSymbolRenderer + public lateinit var scriptInitializerRenderer: KtScriptInitializerRenderer public fun build(): KtDeclarationRenderer = KtDeclarationRenderer( nameRenderer, @@ -284,6 +293,9 @@ public class KtDeclarationRenderer private constructor( anonymousObjectRenderer, singleTypeParameterRenderer, returnTypeFilter, + + scriptRenderer, + scriptInitializerRenderer, ) } } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/bodies/KtScriptInitializerRenderer.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/bodies/KtScriptInitializerRenderer.kt new file mode 100644 index 00000000000..484ebee2e38 --- /dev/null +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/bodies/KtScriptInitializerRenderer.kt @@ -0,0 +1,22 @@ +/* + * 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.analysis.api.renderer.declarations.bodies + +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.renderer.declarations.KtDeclarationRenderer +import org.jetbrains.kotlin.analysis.api.symbols.KtScriptSymbol +import org.jetbrains.kotlin.analysis.utils.printer.PrettyPrinter + +public interface KtScriptInitializerRenderer { + context(KtAnalysisSession, KtDeclarationRenderer) + public fun renderInitializer(symbol: KtScriptSymbol, printer: PrettyPrinter) + + public object NO_INITIALIZER : KtScriptInitializerRenderer { + context(KtAnalysisSession) + override fun renderInitializer(symbol: KtScriptSymbol, printer: PrettyPrinter) { + } + } +} \ No newline at end of file diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/impl/KtDeclarationRendererForSource.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/impl/KtDeclarationRendererForSource.kt index 448adda2f11..a268287afe6 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/impl/KtDeclarationRendererForSource.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/impl/KtDeclarationRendererForSource.kt @@ -82,6 +82,9 @@ public object KtDeclarationRendererForSource { annotationRenderer = KtAnnotationRendererForSource.WITH_QUALIFIED_NAMES declarationTypeApproximator = KtRendererTypeApproximator.TO_DENOTABLE returnTypeFilter = KtCallableReturnTypeFilter.NO_UNIT_FOR_FUNCTIONS + + scriptRenderer = KtScriptSymbolRenderer.AS_SOURCE + scriptInitializerRenderer = KtScriptInitializerRenderer.NO_INITIALIZER } public val WITH_SHORT_NAMES: KtDeclarationRenderer = WITH_QUALIFIED_NAMES.with { diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/callables/KtScriptSymbolRenderer.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/callables/KtScriptSymbolRenderer.kt new file mode 100644 index 00000000000..8474865aeb1 --- /dev/null +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/callables/KtScriptSymbolRenderer.kt @@ -0,0 +1,23 @@ +/* + * 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.analysis.api.renderer.declarations.renderers.callables + +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.renderer.declarations.KtDeclarationRenderer +import org.jetbrains.kotlin.analysis.api.symbols.KtScriptSymbol +import org.jetbrains.kotlin.analysis.utils.printer.PrettyPrinter + +public interface KtScriptSymbolRenderer { + context(KtAnalysisSession, KtDeclarationRenderer) + public fun renderSymbol(symbol: KtScriptSymbol, printer: PrettyPrinter) + + public object AS_SOURCE : KtScriptSymbolRenderer { + context(KtAnalysisSession, KtDeclarationRenderer) + override fun renderSymbol(symbol: KtScriptSymbol, printer: PrettyPrinter) { + scriptInitializerRenderer.renderInitializer(symbol, printer) + } + } +} \ No newline at end of file diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtScriptSymbol.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtScriptSymbol.kt new file mode 100644 index 00000000000..e6d738cd8fe --- /dev/null +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtScriptSymbol.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.analysis.api.symbols + +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotatedSymbol +import org.jetbrains.kotlin.analysis.api.symbols.markers.KtNamedSymbol +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer + +public abstract class KtScriptSymbol : KtDeclarationSymbol, KtAnnotatedSymbol, KtNamedSymbol { + context(KtAnalysisSession) + abstract override fun createPointer(): KtSymbolPointer +} \ No newline at end of file diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtSymbolProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtSymbolProvider.kt index 0873a1ebd31..c0dc5b45a97 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtSymbolProvider.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtSymbolProvider.kt @@ -31,11 +31,13 @@ public abstract class KtSymbolProvider : KtAnalysisSessionComponent() { is KtPropertyAccessor -> getPropertyAccessorSymbol(psi) is KtClassInitializer -> getClassInitializerSymbol(psi) is KtDestructuringDeclarationEntry -> getDestructuringDeclarationEntrySymbol(psi) + is KtScript -> getScriptSymbol(psi) else -> error("Cannot build symbol for ${psi::class}") } public abstract fun getParameterSymbol(psi: KtParameter): KtVariableLikeSymbol public abstract fun getFileSymbol(psi: KtFile): KtFileSymbol + public abstract fun getScriptSymbol(psi: KtScript): KtScriptSymbol public abstract fun getFunctionLikeSymbol(psi: KtNamedFunction): KtFunctionLikeSymbol public abstract fun getConstructorSymbol(psi: KtConstructor<*>): KtConstructorSymbol public abstract fun getTypeParameterSymbol(psi: KtTypeParameter): KtTypeParameterSymbol