FIR LC: fix invalid type param upper bound

This commit is contained in:
Ilya Kirillov
2022-02-25 10:27:28 +01:00
parent e010f59560
commit 4a5aee688e
3 changed files with 19 additions and 18 deletions
@@ -36,7 +36,7 @@ internal fun KtAnalysisSession.mapSuperType(
psiContext: PsiElement,
kotlinCollectionAsIs: Boolean = false
): PsiClassType? {
if (type !is KtNonErrorClassType) return null
if (type is KtClassErrorType) return null
val psiType = type.asPsiType(
psiContext,
if (kotlinCollectionAsIs) KtTypeMappingMode.SUPER_TYPE_KOTLIN_COLLECTIONS_AS_IS else KtTypeMappingMode.SUPER_TYPE,
@@ -13,21 +13,17 @@ import com.intellij.psi.impl.PsiClassImplUtil
import com.intellij.psi.impl.light.LightElement
import com.intellij.psi.javadoc.PsiDocComment
import com.intellij.psi.search.SearchScope
import org.jetbrains.kotlin.analysis.api.isValid
import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol
import org.jetbrains.kotlin.analysis.api.types.KtClassErrorType
import org.jetbrains.kotlin.analysis.api.types.KtNonErrorClassType
import org.jetbrains.kotlin.asJava.classes.KotlinSuperTypeListBuilder
import org.jetbrains.kotlin.asJava.classes.cannotModify
import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.asJava.elements.KtLightAbstractAnnotation
import org.jetbrains.kotlin.asJava.elements.KtLightDeclaration
import org.jetbrains.kotlin.idea.KotlinLanguage
import org.jetbrains.kotlin.analysis.api.isValid
import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol
import org.jetbrains.kotlin.analysis.api.types.KtNonErrorClassType
import org.jetbrains.kotlin.light.classes.symbol.*
import org.jetbrains.kotlin.light.classes.symbol.FirLightTypeParameterListForSymbol
import org.jetbrains.kotlin.light.classes.symbol.analyzeWithSymbolAsContext
import org.jetbrains.kotlin.light.classes.symbol.basicIsEquivalentTo
import org.jetbrains.kotlin.light.classes.symbol.invalidAccess
import org.jetbrains.kotlin.light.classes.symbol.mapSuperType
import org.jetbrains.kotlin.name.StandardClassIds
import org.jetbrains.kotlin.psi.KtTypeParameter
import org.jetbrains.kotlin.psi.psiUtil.startOffset
@@ -66,8 +62,13 @@ internal class FirLightTypeParameter(
)
analyzeWithSymbolAsContext(typeParameterSymbol) {
typeParameterSymbol.upperBounds
.filterIsInstance<KtNonErrorClassType>()
.filter { it.classId != StandardClassIds.Any }
.filter { type ->
when (type) {
is KtNonErrorClassType -> type.classId != StandardClassIds.Any
is KtClassErrorType -> false
else -> true
}
}
.mapNotNull {
mapSuperType(it, this@FirLightTypeParameter, kotlinCollectionAsIs = true)
}
@@ -84,11 +85,11 @@ internal class FirLightTypeParameter(
//PsiClass simple implementation
override fun getImplementsList(): PsiReferenceList? = null
override fun getImplementsListTypes(): Array<PsiClassType> = PsiClassType.EMPTY_ARRAY
override fun getSuperClass(): PsiClass? = null
override fun getInterfaces(): Array<PsiClass> = PsiClass.EMPTY_ARRAY
override fun getSupers(): Array<PsiClass> = PsiClass.EMPTY_ARRAY
override fun getSuperTypes(): Array<PsiClassType> = PsiClassType.EMPTY_ARRAY
override fun getImplementsListTypes(): Array<PsiClassType> = PsiClassImplUtil.getImplementsListTypes(this)
override fun getSuperClass(): PsiClass? = PsiClassImplUtil.getSuperClass(this)
override fun getInterfaces(): Array<PsiClass> = PsiClassImplUtil.getInterfaces(this)
override fun getSupers(): Array<PsiClass> = PsiClassImplUtil.getSupers(this)
override fun getSuperTypes(): Array<PsiClassType> = PsiClassImplUtil.getSuperTypes(this)
override fun getConstructors(): Array<PsiMethod> = PsiMethod.EMPTY_ARRAY
override fun getInitializers(): Array<PsiClassInitializer> = PsiClassInitializer.EMPTY_ARRAY
override fun getAllFields(): Array<PsiField> = PsiField.EMPTY_ARRAY
@@ -52,7 +52,7 @@ public abstract class C /* C*/<T> {
public C(@org.jetbrains.annotations.NotNull() java.util.List<? extends java.lang.CharSequence>);// .ctor(java.util.List<? extends java.lang.CharSequence>)
public final <V, U> T foo(V, @org.jetbrains.annotations.NotNull() C<V>, error.NonExistentClass);// <V, U> foo(V, C<V>, error.NonExistentClass)
public final <V, U extends V> T foo(V, @org.jetbrains.annotations.NotNull() C<V>, error.NonExistentClass);// <V, U extends V> foo(V, C<V>, error.NonExistentClass)
public final Q getW(Q);// getW(Q)
@@ -78,4 +78,4 @@ public class K /* K*/<T extends K<T>> {
public final class Sub /* Sub*/ extends K<K<?>> {
public Sub();// .ctor()
}
}