[Analysis API FIR] KtFirPsiTypeProvider: support type parameter position in asKtType

^KT-66530
This commit is contained in:
Dmitrii Gridin
2024-03-12 17:08:40 +01:00
committed by Space Team
parent 675bf36049
commit ba421aa320
2 changed files with 10 additions and 4 deletions
@@ -58,8 +58,10 @@ import org.jetbrains.kotlin.platform.jvm.JvmPlatform
import org.jetbrains.kotlin.psi import org.jetbrains.kotlin.psi
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.psiUtil.parents import org.jetbrains.kotlin.psi.psiUtil.parents
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
import org.jetbrains.kotlin.types.model.SimpleTypeMarker import org.jetbrains.kotlin.types.model.SimpleTypeMarker
import org.jetbrains.kotlin.types.updateArgumentModeFromAnnotations import org.jetbrains.kotlin.types.updateArgumentModeFromAnnotations
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
import java.text.StringCharacterIterator import java.text.StringCharacterIterator
internal class KtFirPsiTypeProvider( internal class KtFirPsiTypeProvider(
@@ -144,7 +146,7 @@ internal class KtFirPsiTypeProvider(
val javaTypeParameterStack = MutableJavaTypeParameterStack() val javaTypeParameterStack = MutableJavaTypeParameterStack()
var psiClass = PsiTreeUtil.getContextOfType(useSitePosition, PsiClass::class.java, false) var psiClass = PsiTreeUtil.getContextOfType(useSitePosition, PsiClass::class.java, false)
while (psiClass != null && psiClass.name == null) { while (psiClass != null && psiClass.name == null || psiClass is PsiTypeParameter) {
psiClass = PsiTreeUtil.getContextOfType(psiClass, PsiClass::class.java, true) psiClass = PsiTreeUtil.getContextOfType(psiClass, PsiClass::class.java, true)
} }
if (psiClass != null) { if (psiClass != null) {
@@ -161,9 +163,13 @@ internal class KtFirPsiTypeProvider(
), ),
javaClass javaClass
) )
if (containingClassSymbol != null) { if (containingClassSymbol != null) {
val member = val member = useSitePosition.parentsWithSelf
PsiTreeUtil.getContextOfType(useSitePosition, PsiTypeParameterListOwner::class.java, false, PsiClass::class.java) .filterNot { it is PsiTypeParameter }
.takeWhile { it !is PsiClass }
.firstIsInstanceOrNull<PsiTypeParameterListOwner>()
if (member != null) { if (member != null) {
val memberSymbol = containingClassSymbol.declarationSymbols.find { it.findPsi() == member } as? FirCallableSymbol<*> val memberSymbol = containingClassSymbol.declarationSymbols.find { it.findPsi() == member } as? FirCallableSymbol<*>
if (memberSymbol != null) { if (memberSymbol != null) {
@@ -1,2 +1,2 @@
PsiType: PsiType:TYPE PsiType: PsiType:TYPE
KtType: TYPE KtType: TYPE?