Attempt to support kotlin scripting
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 9dbcc4b..9b61fb7 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
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.analysis.api.descriptors.components.base.Fe10KtAnalysisSessionComponent import org.jetbrains.kotlin.analysis.api.descriptors.symbols.KtFe10FileSymbol import org.jetbrains.kotlin.analysis.api.descriptors.symbols.KtFe10PackageSymbol +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.KtFe10ScriptSymbol import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtClassSymbol import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtClassifierSymbol import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtSymbol @@ -145,4 +146,8 @@ override fun getDestructuringDeclarationEntrySymbol(psi: KtDestructuringDeclarationEntry): KtLocalVariableSymbol { return KtFe10PsiLocalVariableSymbol(psi, analysisContext) } + + override fun getScriptSymbol(psi: KtScript): KtScriptSymbol { + return KtFe10ScriptSymbol() + } } \ No newline at end of file
diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/KtFe10ScriptSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/KtFe10ScriptSymbol.kt new file mode 100644 index 0000000..87465e9 --- /dev/null +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/KtFe10ScriptSymbol.kt
@@ -0,0 +1,37 @@ +/* + * 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 + +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList +import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken +import org.jetbrains.kotlin.analysis.api.symbols.KtScriptSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin +import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer +import org.jetbrains.kotlin.name.Name + +internal class KtFe10ScriptSymbol : KtScriptSymbol() { + override val annotationsList: KtAnnotationsList + get() = TODO("Not yet implemented") + override val token: KtLifetimeToken + get() = TODO("Not yet implemented") + override val name: Name? + get() = TODO("Not yet implemented") + override val origin: KtSymbolOrigin + get() = TODO("Not yet implemented") + override val psi: PsiElement? + get() = TODO("Not yet implemented") + + context(KtAnalysisSession) override fun createPointer(): KtSymbolPointer<KtSymbol> { + TODO("Not yet implemented") + } + + override val typeParameters: List<KtTypeParameterSymbol> + get() = TODO("Not yet implemented") +} \ No newline at end of file
diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt index 81b45c8..53dc648 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.allChildren import kotlin.contracts.ExperimentalContracts import kotlin.contracts.contract @@ -38,6 +39,7 @@ override fun getKtExpressionType(expression: KtExpression): KtType? { return when (val fir = expression.unwrap().getOrBuildFir(firResolveSession)) { + is FirScript -> null is FirFunctionCall -> { getReturnTypeForArrayStyleAssignmentTarget(expression, fir) ?: fir.typeRef.coneType.asKtType() @@ -303,3 +305,33 @@ } private enum class DefiniteNullability { DEFINITELY_NULL, DEFINITELY_NOT_NULL, UNKNOWN } + + + +public fun PsiElement.printTree(withMeAsRoot: Boolean = false, indentStep: Int = 3): String { + + fun PsiElement.printTreeInternal( + indent: Int = 0, + result: StringBuilder = StringBuilder(), + toMark: PsiElement? = this, + entire: Boolean = true, + indentStep: Int + ): String { + if (entire) return containingFile.printTreeInternal(toMark = toMark, entire = false, indentStep = indentStep) + + val indentSymbols = if (indent > 0) ".".repeat(indent) else "" + result.append(javaClass.simpleName.prependIndent(indentSymbols)) + .append(" [").append(text).append("]") + .append(if (this == toMark) " (*)" else "") + + val nextIndent = indent + indentStep + this.allChildren.forEach { + result.append("\n") + it.printTreeInternal(nextIndent, result, toMark, entire = false, indentStep = indentStep) + } + + return result.toString() + } + + return printTreeInternal(entire = !withMeAsRoot, indentStep = indentStep) +} \ No newline at end of file
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 e0067d3..2c7d5d0 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
@@ -69,8 +69,7 @@ val outerFirClassifier = symbol.firSymbol.llFirSession.firProvider.getFirClassifierByFqName(outerClassId) ?: return null firSymbolBuilder.buildSymbol(outerFirClassifier) as? KtDeclarationSymbol } - - + is KtScriptSymbol -> getParentSymbolByPsi() } }
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 0000000..2030f91 --- /dev/null +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirScriptSymbol.kt
@@ -0,0 +1,54 @@ +/* + * 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.annotations.KtAnnotationsList +import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession +import org.jetbrains.kotlin.analysis.api.impl.base.annotations.KtEmptyAnnotationsList +import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion +import org.jetbrains.kotlin.analysis.api.symbols.KtScriptSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin +import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol +import org.jetbrains.kotlin.analysis.api.symbols.pointers.CanNotCreateSymbolPointerForLocalLibraryDeclarationException +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer +import org.jetbrains.kotlin.fir.psi +import org.jetbrains.kotlin.fir.symbols.impl.FirScriptSymbol +import org.jetbrains.kotlin.name.Name + +internal class KtFirScriptSymbol( + override val token: KtLifetimeToken, + override val firSymbol: FirScriptSymbol, + override val analysisSession: KtFirAnalysisSession + +) : KtScriptSymbol(), KtFirSymbol<FirScriptSymbol> { + + override val annotationsList: KtAnnotationsList + get() = withValidityAssertion { KtEmptyAnnotationsList(token) } + + override val name: Name? + get() = TODO("Not yet implemented") + + override val psi: PsiElement? = firSymbol.fir.psi + + context(KtAnalysisSession) + override fun createPointer(): KtSymbolPointer<KtSymbol> = withValidityAssertion { + KtPsiBasedSymbolPointer.createForSymbolFromSource(this) + ?: throw CanNotCreateSymbolPointerForLocalLibraryDeclarationException(this::class) + } + + + override val typeParameters: List<KtTypeParameterSymbol> + get() = withValidityAssertion { emptyList() } + + + override val origin: KtSymbolOrigin + get() = KtSymbolOrigin.SOURCE_MEMBER_GENERATED +} \ 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 38bfd76..f28299d 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
@@ -184,4 +184,10 @@ psi.resolveToFirSymbolOfType<FirPropertySymbol>(firResolveSession) ) } + + override fun getScriptSymbol(psi: KtScript): KtScriptSymbol { + val symbol = psi.resolveToFirSymbolOfType<FirScriptSymbol>(firResolveSession) + + return KtFirScriptSymbol(token, symbol, analysisSession) + } }
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 ea24589..d75a74d 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,7 @@ public val anonymousObjectRenderer: KtAnonymousObjectSymbolRenderer, public val singleTypeParameterRenderer: KtSingleTypeParameterSymbolRenderer, public val returnTypeFilter: KtCallableReturnTypeFilter, + public val scriptRenderer: KtScriptRenderer ) { context(KtAnalysisSession) @@ -104,6 +105,7 @@ is KtSyntheticJavaPropertySymbol -> syntheticJavaPropertyRenderer.renderSymbol(symbol, printer) is KtTypeParameterSymbol -> singleTypeParameterRenderer.renderSymbol(symbol, printer) is KtClassInitializerSymbol -> classInitializerRender.renderClassInitializer(symbol, printer) + is KtScriptSymbol -> scriptRenderer.renderSymbol(symbol, printer) } } @@ -164,7 +166,7 @@ this.anonymousObjectRenderer = renderer.anonymousObjectRenderer this.singleTypeParameterRenderer = renderer.singleTypeParameterRenderer this.returnTypeFilter = renderer.returnTypeFilter - + this.scriptRenderer = renderer.scriptRenderer action() } } @@ -228,6 +230,7 @@ public lateinit var typeAliasRenderer: KtTypeAliasSymbolRenderer public lateinit var anonymousObjectRenderer: KtAnonymousObjectSymbolRenderer public lateinit var singleTypeParameterRenderer: KtSingleTypeParameterSymbolRenderer + public lateinit var scriptRenderer: KtScriptRenderer public fun build(): KtDeclarationRenderer = KtDeclarationRenderer( @@ -284,6 +287,7 @@ anonymousObjectRenderer, singleTypeParameterRenderer, returnTypeFilter, + scriptRenderer ) } }
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 448adda..09d1516e 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,7 @@ annotationRenderer = KtAnnotationRendererForSource.WITH_QUALIFIED_NAMES declarationTypeApproximator = KtRendererTypeApproximator.TO_DENOTABLE returnTypeFilter = KtCallableReturnTypeFilter.NO_UNIT_FOR_FUNCTIONS + scriptRenderer = KtScriptRenderer.RENDERER } 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/KtScriptRenderer.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/KtScriptRenderer.kt new file mode 100644 index 0000000..c3fcc7b --- /dev/null +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/KtScriptRenderer.kt
@@ -0,0 +1,25 @@ +/* + * 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 + +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 KtScriptRenderer { + + context(KtAnalysisSession, KtDeclarationRenderer) + public fun renderSymbol(symbol: KtScriptSymbol, printer: PrettyPrinter) + + + public object RENDERER : KtScriptRenderer { + context(KtAnalysisSession, KtDeclarationRenderer) + override fun renderSymbol(symbol: KtScriptSymbol, printer: PrettyPrinter) { + printer.append("Hren znaet chto eto") + } + } +} \ 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 0000000..c374aaa --- /dev/null +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtScriptSymbol.kt
@@ -0,0 +1,12 @@ +/* + * 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.name.Name + +public abstract class KtScriptSymbol : KtDeclarationSymbol { + public abstract val name: Name? +} \ 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 0873a1e..7af7816 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,6 +31,7 @@ is KtPropertyAccessor -> getPropertyAccessorSymbol(psi) is KtClassInitializer -> getClassInitializerSymbol(psi) is KtDestructuringDeclarationEntry -> getDestructuringDeclarationEntrySymbol(psi) + is KtScript -> getScriptSymbol(psi) else -> error("Cannot build symbol for ${psi::class}") } @@ -59,6 +60,8 @@ public abstract fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): Sequence<KtCallableSymbol> + public abstract fun getScriptSymbol(psi: KtScript): KtScriptSymbol + @Suppress("PropertyName") public abstract val ROOT_PACKAGE_SYMBOL: KtPackageSymbol }
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/FirDesignation.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/FirDesignation.kt index 60c7f60..608d65a 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/FirDesignation.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/FirDesignation.kt
@@ -104,6 +104,8 @@ return if (target.diagnostic == ConeDestructuringDeclarationsOnTopLevel) emptyList() else null } + is FirScript -> return emptyList() + else -> { return null }
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirModuleLazyDeclarationResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirModuleLazyDeclarationResolver.kt index fe62898..53d15df 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirModuleLazyDeclarationResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirModuleLazyDeclarationResolver.kt
@@ -24,6 +24,8 @@ import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticPropertyAccessor +import org.jetbrains.kotlin.fir.expressions.FirAnnotation +import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.transformers.FirImportResolveTransformer import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector