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