[FIR] FirScriptConfiguratorExtensionImpl: provide source for script parameters

We need this source to be able to find the parent declaration

^KT-62693 Fixed
This commit is contained in:
Dmitrii Gridin
2023-10-19 14:27:01 +02:00
committed by Space Team
parent 17ab005668
commit 0b45c6ce23
14 changed files with 120 additions and 19 deletions
@@ -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<KtPrimaryConstructor>()!!
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}") {
@@ -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<E: FirVariable, S: FirVariableSymbol<E>>(
internal abstract class KtFirLocalOrErrorVariableSymbol<E : FirVariable, S : FirVariableSymbol<E>>(
override val firSymbol: S,
override val analysisSession: KtFirAnalysisSession,
) : KtLocalVariableSymbol(), KtFirSymbol<S> {
@@ -45,12 +48,16 @@ internal abstract class KtFirLocalOrErrorVariableSymbol<E: FirVariable, S: FirVa
context(KtAnalysisSession)
override fun createPointer(): KtSymbolPointer<KtLocalVariableSymbol> = withValidityAssertion {
KtPsiBasedSymbolPointer.createForSymbolFromSource<KtLocalVariableSymbol>(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) :
@@ -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<KtScriptSymbol>,
) : KtSymbolPointer<KtLocalVariableSymbol>() {
@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<KtSymbol>): Boolean = this === other ||
other is KtFirScriptParameterSymbolPointer &&
other.scriptPointer.pointsToTheSameSymbolAs(scriptPointer)
}
@@ -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 {
@@ -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 {
@@ -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 {
@@ -0,0 +1,3 @@
fun foo() {
arg<caret>s
}
@@ -0,0 +1,2 @@
Resolved to:
0: (in <local>: <script-ScriptArgument.kts>) val args: kotlin.Array<kotlin.String>
@@ -0,0 +1,5 @@
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE
fun foo() {
ar<caret>gs
}
@@ -0,0 +1 @@
val args: kotlin.Array<kotlin.String>
@@ -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<kotlin/String>
symbolKind: LOCAL
typeParameters: []
getContainingModule: KtScriptModule "Script scriptArgument.kts"
deprecationStatus: null
@@ -6,77 +6,77 @@ FILE: [ResolvedTo(RAW_FIR)] scriptArgument.kts
IMPORTS:
FILE: [ResolvedTo(RAW_FIR)] scriptArgument.kts
FILE: [ResolvedTo(IMPORTS)] scriptArgument.kts
context(<script>@kotlin.script.templates.standard.ScriptTemplateWithArgs)
SCRIPT: [ResolvedTo(RAW_FIR)] <script-scriptArgument.kts>
[ResolvedTo(RAW_FIR)] lval args: R|kotlin/Array<kotlin/String>|
COMPILER_REQUIRED_ANNOTATIONS:
FILE: [ResolvedTo(RAW_FIR)] scriptArgument.kts
FILE: [ResolvedTo(IMPORTS)] scriptArgument.kts
context(<script>@kotlin.script.templates.standard.ScriptTemplateWithArgs)
SCRIPT: [ResolvedTo(RAW_FIR)] <script-scriptArgument.kts>
[ResolvedTo(RAW_FIR)] lval args: R|kotlin/Array<kotlin/String>|
COMPANION_GENERATION:
FILE: [ResolvedTo(RAW_FIR)] scriptArgument.kts
FILE: [ResolvedTo(IMPORTS)] scriptArgument.kts
context(<script>@kotlin.script.templates.standard.ScriptTemplateWithArgs)
SCRIPT: [ResolvedTo(RAW_FIR)] <script-scriptArgument.kts>
[ResolvedTo(RAW_FIR)] lval args: R|kotlin/Array<kotlin/String>|
SUPER_TYPES:
FILE: [ResolvedTo(RAW_FIR)] scriptArgument.kts
FILE: [ResolvedTo(IMPORTS)] scriptArgument.kts
context(<script>@kotlin.script.templates.standard.ScriptTemplateWithArgs)
SCRIPT: [ResolvedTo(RAW_FIR)] <script-scriptArgument.kts>
[ResolvedTo(RAW_FIR)] lval args: R|kotlin/Array<kotlin/String>|
TYPES:
FILE: [ResolvedTo(RAW_FIR)] scriptArgument.kts
FILE: [ResolvedTo(IMPORTS)] scriptArgument.kts
context(<script>@kotlin.script.templates.standard.ScriptTemplateWithArgs)
SCRIPT: [ResolvedTo(RAW_FIR)] <script-scriptArgument.kts>
[ResolvedTo(RAW_FIR)] lval args: R|kotlin/Array<kotlin/String>|
STATUS:
FILE: [ResolvedTo(RAW_FIR)] scriptArgument.kts
FILE: [ResolvedTo(IMPORTS)] scriptArgument.kts
context(<script>@kotlin.script.templates.standard.ScriptTemplateWithArgs)
SCRIPT: [ResolvedTo(RAW_FIR)] <script-scriptArgument.kts>
[ResolvedTo(RAW_FIR)] lval args: R|kotlin/Array<kotlin/String>|
EXPECT_ACTUAL_MATCHING:
FILE: [ResolvedTo(RAW_FIR)] scriptArgument.kts
FILE: [ResolvedTo(IMPORTS)] scriptArgument.kts
context(<script>@kotlin.script.templates.standard.ScriptTemplateWithArgs)
SCRIPT: [ResolvedTo(RAW_FIR)] <script-scriptArgument.kts>
[ResolvedTo(RAW_FIR)] lval args: R|kotlin/Array<kotlin/String>|
CONTRACTS:
FILE: [ResolvedTo(RAW_FIR)] scriptArgument.kts
FILE: [ResolvedTo(IMPORTS)] scriptArgument.kts
context(<script>@kotlin.script.templates.standard.ScriptTemplateWithArgs)
SCRIPT: [ResolvedTo(RAW_FIR)] <script-scriptArgument.kts>
[ResolvedTo(RAW_FIR)] lval args: R|kotlin/Array<kotlin/String>|
IMPLICIT_TYPES_BODY_RESOLVE:
FILE: [ResolvedTo(RAW_FIR)] scriptArgument.kts
FILE: [ResolvedTo(IMPORTS)] scriptArgument.kts
context(<script>@kotlin.script.templates.standard.ScriptTemplateWithArgs)
SCRIPT: [ResolvedTo(RAW_FIR)] <script-scriptArgument.kts>
[ResolvedTo(RAW_FIR)] lval args: R|kotlin/Array<kotlin/String>|
ANNOTATION_ARGUMENTS:
FILE: [ResolvedTo(RAW_FIR)] scriptArgument.kts
FILE: [ResolvedTo(IMPORTS)] scriptArgument.kts
context(<script>@kotlin.script.templates.standard.ScriptTemplateWithArgs)
SCRIPT: [ResolvedTo(RAW_FIR)] <script-scriptArgument.kts>
[ResolvedTo(RAW_FIR)] lval args: R|kotlin/Array<kotlin/String>|
BODY_RESOLVE:
FILE: [ResolvedTo(RAW_FIR)] scriptArgument.kts
FILE: [ResolvedTo(IMPORTS)] scriptArgument.kts
context(<script>@kotlin.script.templates.standard.ScriptTemplateWithArgs)
SCRIPT: [ResolvedTo(RAW_FIR)] <script-scriptArgument.kts>
[ResolvedTo(RAW_FIR)] lval args: R|kotlin/Array<kotlin/String>|
@@ -87,3 +87,4 @@ FILE: [ResolvedTo(BODY_RESOLVE)] scriptArgument.kts
context(<script>@R|kotlin/script/templates/standard/ScriptTemplateWithArgs|)
SCRIPT: [ResolvedTo(BODY_RESOLVE)] <script-scriptArgument.kts>
[ResolvedTo(BODY_RESOLVE)] lval args: R|kotlin/Array<kotlin/String>|
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2021 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.
*/
@@ -285,6 +285,9 @@ sealed class KtFakeSourceElementKind(final override val shouldSkipErrorTypeRepor
// Scripts get implicit imports from their configurations
object ImplicitImport : KtFakeSourceElementKind()
// For provided parameters inside a script
object ScriptParameter : KtFakeSourceElementKind()
}
sealed class AbstractKtSourceElement {
@@ -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.
*/
@@ -27,7 +27,6 @@ import org.jetbrains.kotlin.fir.symbols.SymbolInternals
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.fir.types.builder.buildUserTypeRef
import org.jetbrains.kotlin.fir.types.coneTypeOrNull
import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImplWithoutSource
import org.jetbrains.kotlin.fir.types.impl.FirQualifierPartImpl
import org.jetbrains.kotlin.fir.types.impl.FirTypeArgumentListImpl
@@ -97,6 +96,7 @@ class FirScriptConfiguratorExtensionImpl(
parameters.add(
buildProperty {
moduleData = session.moduleData
source = this@configure.source?.fakeElement(KtFakeSourceElementKind.ScriptParameter)
origin = FirDeclarationOrigin.ScriptCustomization.Default
// TODO: copy type parameters?
returnTypeRef = baseCtorParameter.returnTypeRef
@@ -125,6 +125,7 @@ class FirScriptConfiguratorExtensionImpl(
parameters.add(
buildProperty {
moduleData = session.moduleData
source = this@configure.source?.fakeElement(KtFakeSourceElementKind.ScriptParameter)
origin = FirDeclarationOrigin.ScriptCustomization.Default
returnTypeRef = typeRef
name = Name.identifier(propertyName)