[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:
committed by
Space Team
parent
17ab005668
commit
0b45c6ce23
+3
-2
@@ -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}") {
|
||||
|
||||
+10
-3
@@ -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) :
|
||||
|
||||
+37
@@ -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)
|
||||
}
|
||||
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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
|
||||
}
|
||||
+1
@@ -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 {
|
||||
|
||||
+3
-2
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user