[FIR IDE] Fix KtSymbolProvider.getParameterSymbol() in AAPI/FE10
For loop parameters, Analysis API expects a local variable to be returned. The additional check regarding lambda parameters is also added to reflect the FIR behavior. This commit partially fixes KtFe10SymbolByPsiTestGenerated.testForLoopVariable().
This commit is contained in:
+6
-2
@@ -35,8 +35,12 @@ internal class KtFe10SymbolProvider(
|
|||||||
return KtFe10FileSymbol(psi, analysisContext)
|
return KtFe10FileSymbol(psi, analysisContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getParameterSymbol(psi: KtParameter): KtValueParameterSymbol = withValidityAssertion {
|
override fun getParameterSymbol(psi: KtParameter): KtVariableLikeSymbol = withValidityAssertion {
|
||||||
return KtFe10PsiValueParameterSymbol(psi, analysisContext)
|
return when {
|
||||||
|
psi.isFunctionTypeParameter -> error("Function type parameters are not supported in getParameterSymbol()")
|
||||||
|
psi.isLoopParameter -> KtFe10PsiLoopParameterLocalVariableSymbol(psi, analysisContext)
|
||||||
|
else -> KtFe10PsiValueParameterSymbol(psi, analysisContext)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getFunctionLikeSymbol(psi: KtNamedFunction): KtFunctionLikeSymbol = withValidityAssertion {
|
override fun getFunctionLikeSymbol(psi: KtNamedFunction): KtFunctionLikeSymbol = withValidityAssertion {
|
||||||
|
|||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2021 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.psiBased
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
|
||||||
|
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisFacade
|
||||||
|
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeAndAnnotations
|
||||||
|
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||||
|
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.KtFe10PsiSymbol
|
||||||
|
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.createErrorTypeAndAnnotations
|
||||||
|
import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached
|
||||||
|
import org.jetbrains.kotlin.analysis.api.symbols.KtLocalVariableSymbol
|
||||||
|
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
|
||||||
|
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
|
||||||
|
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||||
|
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||||
|
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||||
|
import org.jetbrains.kotlin.descriptors.VariableDescriptor
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
import org.jetbrains.kotlin.psi.KtParameter
|
||||||
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
|
|
||||||
|
internal class KtFe10PsiLoopParameterLocalVariableSymbol(
|
||||||
|
override val psi: KtParameter,
|
||||||
|
override val analysisContext: Fe10AnalysisContext
|
||||||
|
) : KtLocalVariableSymbol(), KtFe10PsiSymbol<KtParameter, VariableDescriptor> {
|
||||||
|
override val descriptor: VariableDescriptor? by cached {
|
||||||
|
val bindingContext = analysisContext.analyze(psi, Fe10AnalysisFacade.AnalysisMode.PARTIAL)
|
||||||
|
bindingContext[BindingContext.VALUE_PARAMETER, psi]
|
||||||
|
}
|
||||||
|
|
||||||
|
override val name: Name
|
||||||
|
get() = withValidityAssertion { psi.nameAsSafeName }
|
||||||
|
|
||||||
|
override val annotatedType: KtTypeAndAnnotations
|
||||||
|
get() = withValidityAssertion { descriptor?.type?.toKtTypeAndAnnotations(analysisContext) ?: createErrorTypeAndAnnotations() }
|
||||||
|
|
||||||
|
override val isVal: Boolean
|
||||||
|
get() = withValidityAssertion { !psi.isMutable }
|
||||||
|
|
||||||
|
override val symbolKind: KtSymbolKind
|
||||||
|
get() = withValidityAssertion { KtSymbolKind.LOCAL }
|
||||||
|
|
||||||
|
override fun createPointer(): KtSymbolPointer<KtLocalVariableSymbol> = withValidityAssertion {
|
||||||
|
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user