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 e0f3b3bf45b..d63235fd549 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 @@ -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. */ @@ -21,7 +21,6 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.llFirSession import org.jetbrains.kotlin.analysis.low.level.api.fir.util.getContainingFile import org.jetbrains.kotlin.analysis.low.level.api.fir.util.originalDeclaration import org.jetbrains.kotlin.analysis.project.structure.KtModule -import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment import org.jetbrains.kotlin.analysis.utils.printer.parentOfType import org.jetbrains.kotlin.fir.FirElementWithResolveState import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol @@ -32,6 +31,7 @@ import org.jetbrains.kotlin.fir.resolve.providers.firProvider import org.jetbrains.kotlin.fir.symbols.impl.FirErrorPropertySymbol import org.jetbrains.kotlin.psi import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment internal class KtFirSymbolContainingDeclarationProvider( override val analysisSession: KtFirAnalysisSession, @@ -104,6 +104,7 @@ internal class KtFirSymbolContainingDeclarationProvider( KtFakeSourceElementKind.ImplicitConstructor -> return source.psi as KtDeclaration KtFakeSourceElementKind.PropertyFromParameter -> return source.psi?.parentOfType()!! KtFakeSourceElementKind.EnumInitializer -> return source.psi as KtEnumEntry + KtFakeSourceElementKind.ScriptParameter -> return source.psi as KtScript KtRealSourceElementKind -> source.psi!! else -> errorWithAttachment("errorWithAttachment FirSourceElement: kind=${source.kind} element=${source.psi!!::class.simpleName}") { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirLocalVariableSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirLocalVariableSymbol.kt index 2d9d0e2a134..1c79ee843ef 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirLocalVariableSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirLocalVariableSymbol.kt @@ -1,16 +1,19 @@ /* - * 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. */ package org.jetbrains.kotlin.analysis.api.fir.symbols import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.KtFakeSourceElementKind 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.fir.annotations.KtFirAnnotationListForDeclaration import org.jetbrains.kotlin.analysis.api.fir.getAllowedPsi +import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirScriptParameterSymbolPointer +import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.requireOwnerPointer import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.symbols.KtLocalVariableSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind @@ -26,7 +29,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol import org.jetbrains.kotlin.name.Name -internal abstract class KtFirLocalOrErrorVariableSymbol>( +internal abstract class KtFirLocalOrErrorVariableSymbol>( override val firSymbol: S, override val analysisSession: KtFirAnalysisSession, ) : KtLocalVariableSymbol(), KtFirSymbol { @@ -45,12 +48,16 @@ internal abstract class KtFirLocalOrErrorVariableSymbol = withValidityAssertion { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } + + if (firSymbol.fir.source?.kind == KtFakeSourceElementKind.ScriptParameter) { + return KtFirScriptParameterSymbolPointer(name, requireOwnerPointer()) + } + throw CanNotCreateSymbolPointerForLocalLibraryDeclarationException(name.asString()) } override fun equals(other: Any?): Boolean = symbolEquals(other) override fun hashCode(): Int = symbolHashCode() - } internal class KtFirLocalVariableSymbol(firSymbol: FirPropertySymbol, analysisSession: KtFirAnalysisSession) : diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirScriptParameterSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirScriptParameterSymbolPointer.kt new file mode 100644 index 00000000000..8b8fa13e148 --- /dev/null +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirScriptParameterSymbolPointer.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.fir.symbols.pointers + +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession +import org.jetbrains.kotlin.analysis.api.fir.utils.firSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtLocalVariableSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtScriptSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer +import org.jetbrains.kotlin.fir.declarations.FirProperty +import org.jetbrains.kotlin.fir.declarations.FirScript +import org.jetbrains.kotlin.name.Name + +internal class KtFirScriptParameterSymbolPointer( + private val parameterName: Name, + private val scriptPointer: KtSymbolPointer, +) : KtSymbolPointer() { + @Deprecated("Consider using org.jetbrains.kotlin.analysis.api.KtAnalysisSession.restoreSymbol") + override fun restoreSymbol(analysisSession: KtAnalysisSession): KtLocalVariableSymbol? { + require(analysisSession is KtFirAnalysisSession) + val script = with(analysisSession) { + scriptPointer.restoreSymbol()?.firSymbol?.fir as? FirScript + } ?: return null + + val parameter = script.parameters.find { it.name == parameterName } as? FirProperty ?: return null + return analysisSession.firSymbolBuilder.variableLikeBuilder.buildLocalVariableSymbol(parameter.symbol) + } + + override fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean = this === other || + other is KtFirScriptParameterSymbolPointer && + other.scriptPointer.pointsToTheSameSymbolAs(scriptPointer) +} diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisScriptSourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisScriptSourceModuleReferenceResolveTestGenerated.java index 47f81624afa..1091ddaadc6 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisScriptSourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisScriptSourceModuleReferenceResolveTestGenerated.java @@ -46,6 +46,12 @@ public class FirIdeDependentAnalysisScriptSourceModuleReferenceResolveTestGenera KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve"), Pattern.compile("^(.+)\\.kts$"), null, true); } + @Test + @TestMetadata("ScriptArgument.kts") + public void testScriptArgument() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/ScriptArgument.kts"); + } + @Test @TestMetadata("ScriptResult.kts") public void testScriptResult() throws Exception { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisScriptSourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisScriptSourceModuleReferenceResolveTestGenerated.java index 8c2ccbea63b..06f9ff185a0 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisScriptSourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisScriptSourceModuleReferenceResolveTestGenerated.java @@ -46,6 +46,12 @@ public class FirIdeNormalAnalysisScriptSourceModuleReferenceResolveTestGenerated KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve"), Pattern.compile("^(.+)\\.kts$"), null, true); } + @Test + @TestMetadata("ScriptArgument.kts") + public void testScriptArgument() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/ScriptArgument.kts"); + } + @Test @TestMetadata("ScriptResult.kts") public void testScriptResult() throws Exception { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisScriptSourceModuleSymbolByReferenceTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisScriptSourceModuleSymbolByReferenceTestGenerated.java index 3e02693056f..68674bf88ff 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisScriptSourceModuleSymbolByReferenceTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisScriptSourceModuleSymbolByReferenceTestGenerated.java @@ -46,6 +46,12 @@ public class FirIdeNormalAnalysisScriptSourceModuleSymbolByReferenceTestGenerate KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/symbols/symbolByReference"), Pattern.compile("^(.+)\\.kts$"), null, true); } + @Test + @TestMetadata("scriptArgument.kts") + public void testScriptArgument() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/scriptArgument.kts"); + } + @Test @TestMetadata("scriptResult.kts") public void testScriptResult() throws Exception { diff --git a/analysis/analysis-api/testData/referenceResolve/ScriptArgument.kts b/analysis/analysis-api/testData/referenceResolve/ScriptArgument.kts new file mode 100644 index 00000000000..93933263285 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/ScriptArgument.kts @@ -0,0 +1,3 @@ +fun foo() { + args +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/ScriptArgument.txt b/analysis/analysis-api/testData/referenceResolve/ScriptArgument.txt new file mode 100644 index 00000000000..72e9cb91a16 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/ScriptArgument.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in : ) val args: kotlin.Array diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/scriptArgument.kts b/analysis/analysis-api/testData/symbols/symbolByReference/scriptArgument.kts new file mode 100644 index 00000000000..d1ed375ceef --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/scriptArgument.kts @@ -0,0 +1,5 @@ +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE + +fun foo() { + args +} diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/scriptArgument.pretty.txt b/analysis/analysis-api/testData/symbols/symbolByReference/scriptArgument.pretty.txt new file mode 100644 index 00000000000..7ff93aa2b25 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/scriptArgument.pretty.txt @@ -0,0 +1 @@ +val args: kotlin.Array diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/scriptArgument.txt b/analysis/analysis-api/testData/symbols/symbolByReference/scriptArgument.txt new file mode 100644 index 00000000000..6cbfeb2be33 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/scriptArgument.txt @@ -0,0 +1,22 @@ +KtLocalVariableSymbol: + annotationsList: [] + callableIdIfNonLocal: null + contextReceivers: [] + isExtension: false + isVal: true + name: args + origin: PLUGIN + receiverParameter: null + returnType: KtUsualClassType: + annotationsList: [] + ownTypeArguments: [ + KtUsualClassType: + annotationsList: [] + ownTypeArguments: [] + type: kotlin/String + ] + type: kotlin/Array + symbolKind: LOCAL + typeParameters: [] + getContainingModule: KtScriptModule "Script scriptArgument.kts" + deprecationStatus: null diff --git a/analysis/low-level-api-fir/testData/lazyResolve/scriptArgument.txt b/analysis/low-level-api-fir/testData/lazyResolve/scriptArgument.txt index ab33d2a93aa..b20fbeb297b 100644 --- a/analysis/low-level-api-fir/testData/lazyResolve/scriptArgument.txt +++ b/analysis/low-level-api-fir/testData/lazyResolve/scriptArgument.txt @@ -6,77 +6,77 @@ FILE: [ResolvedTo(RAW_FIR)] scriptArgument.kts IMPORTS: -FILE: [ResolvedTo(RAW_FIR)] scriptArgument.kts +FILE: [ResolvedTo(IMPORTS)] scriptArgument.kts context(