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 ca545e4bf13..305c28b7081 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 @@ -35,8 +35,12 @@ internal class KtFe10SymbolProvider( return KtFe10FileSymbol(psi, analysisContext) } - override fun getParameterSymbol(psi: KtParameter): KtValueParameterSymbol = withValidityAssertion { - return KtFe10PsiValueParameterSymbol(psi, analysisContext) + override fun getParameterSymbol(psi: KtParameter): KtVariableLikeSymbol = withValidityAssertion { + 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 { diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiLoopParameterLocalVariableSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiLoopParameterLocalVariableSymbol.kt new file mode 100644 index 00000000000..bef8ff2e702 --- /dev/null +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiLoopParameterLocalVariableSymbol.kt @@ -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 { + 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 = withValidityAssertion { + return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer() + } +} \ No newline at end of file