[FIR IDE] LC minor refactorings

This commit is contained in:
Igor Yakovlev
2020-12-01 03:31:05 +03:00
parent a1603716ed
commit a7d7aa123e
16 changed files with 78 additions and 99 deletions
@@ -16,7 +16,7 @@ sealed class KtClassifierSymbol : KtSymbol, KtNamedSymbol
abstract class KtTypeParameterSymbol : KtClassifierSymbol(), KtNamedSymbol { abstract class KtTypeParameterSymbol : KtClassifierSymbol(), KtNamedSymbol {
abstract override fun createPointer(): KtSymbolPointer<KtTypeParameterSymbol> abstract override fun createPointer(): KtSymbolPointer<KtTypeParameterSymbol>
abstract val bounds: List<KtType> abstract val upperBounds: List<KtType>
} }
sealed class KtClassLikeSymbol : KtClassifierSymbol(), KtNamedSymbol, KtSymbolWithKind { sealed class KtClassLikeSymbol : KtClassifierSymbol(), KtNamedSymbol, KtSymbolWithKind {
@@ -6,11 +6,10 @@
package org.jetbrains.kotlin.idea.asJava package org.jetbrains.kotlin.idea.asJava
import com.intellij.psi.* import com.intellij.psi.*
import com.intellij.psi.impl.PsiImplUtil
import org.jetbrains.kotlin.asJava.classes.cannotModify import org.jetbrains.kotlin.asJava.classes.cannotModify
import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.asJava.elements.* import org.jetbrains.kotlin.asJava.elements.KtLightElement
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotationCall import org.jetbrains.kotlin.asJava.elements.KtLightElementBase
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
internal abstract class FirLightAbstractAnnotation(parent: PsiElement) : internal abstract class FirLightAbstractAnnotation(parent: PsiElement) :
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.idea.asJava
import com.intellij.psi.PsiAnnotationMemberValue import com.intellij.psi.PsiAnnotationMemberValue
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.impl.PsiImplUtil
import org.jetbrains.kotlin.psi.KtCallElement import org.jetbrains.kotlin.psi.KtCallElement
internal class FirLightSimpleAnnotation( internal class FirLightSimpleAnnotation(
@@ -69,8 +69,8 @@ internal fun KtAnnotatedSymbol.hasDeprecatedAnnotation(annotationUseSiteTarget:
internal fun KtAnnotatedSymbol.hasJvmOverloadsAnnotation(): Boolean = internal fun KtAnnotatedSymbol.hasJvmOverloadsAnnotation(): Boolean =
hasAnnotation("kotlin/jvm/JvmOverloads", null) hasAnnotation("kotlin/jvm/JvmOverloads", null)
internal fun KtAnnotatedSymbol.hasJvmStaticAnnotation(): Boolean = internal fun KtAnnotatedSymbol.hasJvmStaticAnnotation(annotationUseSiteTarget: AnnotationUseSiteTarget? = null): Boolean =
hasAnnotation("kotlin/jvm/JvmStatic", null) hasAnnotation("kotlin/jvm/JvmStatic", annotationUseSiteTarget)
internal fun KtAnnotatedSymbol.hasInlineOnlyAnnotation(): Boolean = internal fun KtAnnotatedSymbol.hasInlineOnlyAnnotation(): Boolean =
hasAnnotation("kotlin/internal/InlineOnly", null) hasAnnotation("kotlin/internal/InlineOnly", null)
@@ -12,7 +12,6 @@ import org.jetbrains.kotlin.idea.asJava.*
import org.jetbrains.kotlin.idea.asJava.FirLightClassModifierList import org.jetbrains.kotlin.idea.asJava.FirLightClassModifierList
import org.jetbrains.kotlin.idea.asJava.FirLightPsiJavaCodeReferenceElementWithNoReference import org.jetbrains.kotlin.idea.asJava.FirLightPsiJavaCodeReferenceElementWithNoReference
import org.jetbrains.kotlin.idea.asJava.classes.createMethods import org.jetbrains.kotlin.idea.asJava.classes.createMethods
import org.jetbrains.kotlin.idea.asJava.fields.FirLightFieldForEnumEntry
import org.jetbrains.kotlin.idea.frontend.api.fir.analyzeWithSymbolAsContext import org.jetbrains.kotlin.idea.frontend.api.fir.analyzeWithSymbolAsContext
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtEnumEntrySymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtEnumEntrySymbol
import org.jetbrains.kotlin.idea.frontend.api.types.KtClassType import org.jetbrains.kotlin.idea.frontend.api.types.KtClassType
@@ -14,7 +14,6 @@ import org.jetbrains.kotlin.idea.asJava.classes.*
import org.jetbrains.kotlin.idea.asJava.classes.createInheritanceList import org.jetbrains.kotlin.idea.asJava.classes.createInheritanceList
import org.jetbrains.kotlin.idea.asJava.classes.createInnerClasses import org.jetbrains.kotlin.idea.asJava.classes.createInnerClasses
import org.jetbrains.kotlin.idea.asJava.classes.createMethods import org.jetbrains.kotlin.idea.asJava.classes.createMethods
import org.jetbrains.kotlin.idea.asJava.fields.FirLightFieldForEnumEntry
import org.jetbrains.kotlin.idea.frontend.api.fir.analyzeWithSymbolAsContext import org.jetbrains.kotlin.idea.frontend.api.fir.analyzeWithSymbolAsContext
import org.jetbrains.kotlin.idea.frontend.api.symbols.* import org.jetbrains.kotlin.idea.frontend.api.symbols.*
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolKind
@@ -128,7 +127,7 @@ internal open class FirLightClassForSymbol(
.mapTo(result) { .mapTo(result) {
FirLightFieldForPropertySymbol( FirLightFieldForPropertySymbol(
propertySymbol = it, propertySymbol = it,
nameGenerator = nameGenerator, fieldName = nameGenerator.generateUniqueFieldName(it.name.asString()),
containingClass = this@FirLightClassForSymbol, containingClass = this@FirLightClassForSymbol,
lightMemberOrigin = null, lightMemberOrigin = null,
isTopLevel = false, isTopLevel = false,
@@ -19,7 +19,6 @@ import org.jetbrains.kotlin.asJava.elements.KtLightMethod
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fir.symbols.StandardClassIds import org.jetbrains.kotlin.fir.symbols.StandardClassIds
import org.jetbrains.kotlin.idea.asJava.* import org.jetbrains.kotlin.idea.asJava.*
import org.jetbrains.kotlin.idea.asJava.fields.FirLightFieldForEnumEntry
import org.jetbrains.kotlin.idea.frontend.api.analyze import org.jetbrains.kotlin.idea.frontend.api.analyze
import org.jetbrains.kotlin.idea.frontend.api.fir.analyzeWithSymbolAsContext import org.jetbrains.kotlin.idea.frontend.api.fir.analyzeWithSymbolAsContext
import org.jetbrains.kotlin.idea.frontend.api.symbols.* import org.jetbrains.kotlin.idea.frontend.api.symbols.*
@@ -139,7 +138,7 @@ internal fun FirLightClassBase.createMethods(
containingClass = this@createMethods, containingClass = this@createMethods,
isTopLevel = isTopLevel, isTopLevel = isTopLevel,
methodIndex = methodIndex++, methodIndex = methodIndex++,
argumentsSkipMask = skipMask.clone() as BitSet argumentsSkipMask = skipMask.copy()
) )
) )
} }
@@ -225,7 +224,7 @@ internal fun FirLightClassBase.createField(
result.add( result.add(
FirLightFieldForPropertySymbol( FirLightFieldForPropertySymbol(
propertySymbol = declaration, propertySymbol = declaration,
nameGenerator = nameGenerator, fieldName = nameGenerator.generateUniqueFieldName(declaration.name.asString()),
containingClass = this, containingClass = this,
lightMemberOrigin = null, lightMemberOrigin = null,
isTopLevel = isTopLevel, isTopLevel = isTopLevel,
@@ -262,7 +261,7 @@ internal fun FirLightClassBase.createInheritanceList(forExtendsList: Boolean, su
} }
//TODO Add support for kotlin.collections. //TODO Add support for kotlin.collections.
superTypes superTypes.asSequence()
.filterIsInstance<KtClassType>() .filterIsInstance<KtClassType>()
.filter { it.needToAddTypeIntoList() } .filter { it.needToAddTypeIntoList() }
.mapNotNull { it.mapSupertype(this, kotlinCollectionAsIs = true) } .mapNotNull { it.mapSupertype(this, kotlinCollectionAsIs = true) }
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * 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.idea.asJava.fields package org.jetbrains.kotlin.idea.asJava
import com.intellij.psi.* import com.intellij.psi.*
import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin
@@ -11,10 +11,6 @@ import org.jetbrains.kotlin.asJava.classes.*
import org.jetbrains.kotlin.asJava.elements.FirLightIdentifier import org.jetbrains.kotlin.asJava.elements.FirLightIdentifier
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.idea.asJava.* import org.jetbrains.kotlin.idea.asJava.*
import org.jetbrains.kotlin.idea.asJava.FirLightClassForSymbol
import org.jetbrains.kotlin.idea.asJava.FirLightClassModifierList
import org.jetbrains.kotlin.idea.asJava.FirLightField
import org.jetbrains.kotlin.idea.asJava.asPsiType
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtEnumEntrySymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtEnumEntrySymbol
import org.jetbrains.kotlin.idea.util.ifTrue import org.jetbrains.kotlin.idea.util.ifTrue
import org.jetbrains.kotlin.psi.KtEnumEntry import org.jetbrains.kotlin.psi.KtEnumEntry
@@ -33,7 +29,7 @@ internal class FirLightFieldForEnumEntry(
) )
} }
override fun getModifierList(): PsiModifierList? = _modifierList override fun getModifierList(): PsiModifierList = _modifierList
override val kotlinOrigin: KtEnumEntry? = enumEntrySymbol.psi as? KtEnumEntry override val kotlinOrigin: KtEnumEntry? = enumEntrySymbol.psi as? KtEnumEntry
@@ -10,8 +10,6 @@ import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin
import org.jetbrains.kotlin.asJava.classes.KtLightClass import org.jetbrains.kotlin.asJava.classes.KtLightClass
import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.asJava.elements.FirLightIdentifier import org.jetbrains.kotlin.asJava.elements.FirLightIdentifier
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassKind
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol
import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtDeclaration
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.psi.KtDeclaration
internal class FirLightFieldForPropertySymbol( internal class FirLightFieldForPropertySymbol(
private val propertySymbol: KtPropertySymbol, private val propertySymbol: KtPropertySymbol,
nameGenerator: FieldNameGenerator, private val fieldName: String,
containingClass: FirLightClassBase, containingClass: FirLightClassBase,
lightMemberOrigin: LightMemberOrigin?, lightMemberOrigin: LightMemberOrigin?,
isTopLevel: Boolean, isTopLevel: Boolean,
@@ -25,8 +25,6 @@ internal class FirLightFieldForPropertySymbol(
takePropertyVisibility: Boolean takePropertyVisibility: Boolean
) : FirLightField(containingClass, lightMemberOrigin) { ) : FirLightField(containingClass, lightMemberOrigin) {
private val _name: String = nameGenerator.generateUniqueFieldName(propertySymbol.name.asString())
override val kotlinOrigin: KtDeclaration? = propertySymbol.psi as? KtDeclaration override val kotlinOrigin: KtDeclaration? = propertySymbol.psi as? KtDeclaration
private val _returnedType: PsiType by lazyPub { private val _returnedType: PsiType by lazyPub {
@@ -51,37 +49,37 @@ internal class FirLightFieldForPropertySymbol(
override fun getType(): PsiType = _returnedType override fun getType(): PsiType = _returnedType
override fun getName(): String = _name override fun getName(): String = fieldName
private val _modifierList: PsiModifierList by lazyPub { private val _modifierList: PsiModifierList by lazyPub {
val modifiers = mutableSetOf<String>()
val suppressFinal = !propertySymbol.isVal val suppressFinal = !propertySymbol.isVal
val modifiersFromSymbol = propertySymbol.computeModalityForMethod( propertySymbol.computeModalityForMethod(
isTopLevel = isTopLevel, isTopLevel = isTopLevel,
suppressFinal = suppressFinal suppressFinal = suppressFinal,
result = modifiers
) )
val basicModifiers = modifiersFromSymbol.add( if (forceStatic) {
what = PsiModifier.STATIC, modifiers.add(PsiModifier.STATIC)
`if` = forceStatic }
)
val visibility = val visibility =
if (takePropertyVisibility) propertySymbol.computeVisibility(isTopLevel = false) else PsiModifier.PRIVATE if (takePropertyVisibility) propertySymbol.computeVisibility(isTopLevel = false) else PsiModifier.PRIVATE
modifiers.add(visibility)
val modifiersWithVisibility = basicModifiers + visibility if (!suppressFinal) {
modifiers.add(PsiModifier.FINAL)
val modifiers = modifiersWithVisibility.add( }
what = PsiModifier.FINAL, if (propertySymbol.hasAnnotation("kotlin/jvm/Transient", null)) {
`if` = !suppressFinal modifiers.add(PsiModifier.TRANSIENT)
).add( }
what = PsiModifier.TRANSIENT, if (propertySymbol.hasAnnotation("kotlin/jvm/Volatile", null)) {
`if` = propertySymbol.hasAnnotation("kotlin/jvm/Transient", null) modifiers.add(PsiModifier.VOLATILE)
).add( }
what = PsiModifier.VOLATILE,
`if` = propertySymbol.hasAnnotation("kotlin/jvm/Volatile", null)
)
val nullability = if (visibility != PsiModifier.PRIVATE) val nullability = if (visibility != PsiModifier.PRIVATE)
propertySymbol.type.getTypeNullability(propertySymbol, FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) propertySymbol.type.getTypeNullability(propertySymbol, FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE)
@@ -39,6 +39,7 @@ import org.jetbrains.kotlin.load.kotlin.TypeMappingMode
import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.types.model.SimpleTypeMarker import org.jetbrains.kotlin.types.model.SimpleTypeMarker
import java.text.StringCharacterIterator import java.text.StringCharacterIterator
import java.util.*
internal fun <L : Any> L.invalidAccess(): Nothing = internal fun <L : Any> L.invalidAccess(): Nothing =
error("Cls delegate shouldn't be accessed for fir light classes! Qualified name: ${javaClass.name}") error("Cls delegate shouldn't be accessed for fir light classes! Qualified name: ${javaClass.name}")
@@ -192,39 +193,25 @@ internal fun KtSymbolWithModality<*>.computeSimpleModality(): String? = when (mo
else -> throw NotImplementedError() else -> throw NotImplementedError()
} }
internal fun FirMemberDeclaration.computeModalityForMethod(isTopLevel: Boolean): Set<String> {
require(this !is FirConstructor)
val simpleModifier = computeSimpleModality()
val withNative = if (isExternal) simpleModifier + PsiModifier.NATIVE else simpleModifier
val withTopLevelStatic = if (isTopLevel) withNative + PsiModifier.STATIC else withNative
return withTopLevelStatic
}
internal fun KtSymbolWithModality<KtCommonSymbolModality>.computeModalityForMethod( internal fun KtSymbolWithModality<KtCommonSymbolModality>.computeModalityForMethod(
isTopLevel: Boolean, isTopLevel: Boolean,
suppressFinal: Boolean suppressFinal: Boolean,
): Set<String> { result: MutableSet<String>
) {
require(this !is KtClassLikeSymbol) require(this !is KtClassLikeSymbol)
val modality = mutableSetOf<String>()
computeSimpleModality()?.run { computeSimpleModality()?.run {
if (this != PsiModifier.FINAL || !suppressFinal) { if (this != PsiModifier.FINAL || !suppressFinal) {
modality.add(this) result.add(this)
} }
} }
if (this is KtFunctionSymbol && isExternal) { if (this is KtFunctionSymbol && isExternal) {
modality.add(PsiModifier.NATIVE) result.add(PsiModifier.NATIVE)
} }
if (isTopLevel) { if (isTopLevel) {
modality.add(PsiModifier.STATIC) result.add(PsiModifier.STATIC)
} }
return modality
} }
internal fun FirMemberDeclaration.computeVisibility(isTopLevel: Boolean): String { internal fun FirMemberDeclaration.computeVisibility(isTopLevel: Boolean): String {
@@ -337,8 +324,7 @@ internal fun KtSimpleConstantValue<*>.createPsiLiteral(parent: PsiElement): PsiE
} }
} }
internal fun <T> Set<T>.add(what: T, `if`: Boolean): Set<T> =
applyIf(`if`) { this + what }
internal inline fun <T> T.applyIf(`if`: Boolean, body: T.() -> T): T = internal inline fun <T> T.applyIf(`if`: Boolean, body: T.() -> T): T =
if (`if`) body() else this if (`if`) body() else this
internal fun BitSet.copy(): BitSet = clone() as BitSet
@@ -79,25 +79,30 @@ internal class FirLightAccessorMethodForSymbol(
val isOverrideMethod = propertyAccessorSymbol.isOverride || containingPropertySymbol.isOverride val isOverrideMethod = propertyAccessorSymbol.isOverride || containingPropertySymbol.isOverride
val isInterfaceMethod = containingClass.isInterface val isInterfaceMethod = containingClass.isInterface
val modifiers = mutableSetOf<String>()
containingPropertySymbol.computeModalityForMethod(
isTopLevel = isTopLevel,
suppressFinal = isOverrideMethod || isInterfaceMethod,
result = modifiers
)
val visibility = isOverrideMethod.ifTrue { val visibility = isOverrideMethod.ifTrue {
(containingClass as? FirLightClassForSymbol) (containingClass as? FirLightClassForSymbol)
?.tryGetEffectiveVisibility(containingPropertySymbol) ?.tryGetEffectiveVisibility(containingPropertySymbol)
?.toPsiVisibility(isTopLevel) ?.toPsiVisibility(isTopLevel)
} ?: propertyAccessorSymbol.computeVisibility(isTopLevel) } ?: propertyAccessorSymbol.computeVisibility(isTopLevel)
modifiers.add(visibility)
val modifiers = containingPropertySymbol.computeModalityForMethod( if (containingPropertySymbol.hasJvmStaticAnnotation(accessorSite)) {
isTopLevel = isTopLevel, modifiers.add(PsiModifier.STATIC)
suppressFinal = isOverrideMethod || isInterfaceMethod }
) + visibility
if (isInterfaceMethod) {
modifiers.add(PsiModifier.ABSTRACT)
}
modifiers modifiers
.add(
what = PsiModifier.STATIC,
`if` = _annotations.any { it.qualifiedName == "kotlin.jvm.JvmStatic" }
).add(
what = PsiModifier.ABSTRACT,
`if` = isInterfaceMethod
)
} }
private val _modifierList: PsiModifierList by lazyPub { private val _modifierList: PsiModifierList by lazyPub {
@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin
import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.asJava.elements.FirLightIdentifier import org.jetbrains.kotlin.asJava.elements.FirLightIdentifier
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtFunctionLikeSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtFunctionLikeSymbol
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtDeclaration
import java.util.* import java.util.*
@@ -86,21 +86,27 @@ internal class FirLightSimpleMethodForSymbol(
val finalModifier = kotlinOrigin?.hasModifier(KtTokens.FINAL_KEYWORD) == true val finalModifier = kotlinOrigin?.hasModifier(KtTokens.FINAL_KEYWORD) == true
val modifiers = functionSymbol.computeModalityForMethod( val modifiers = mutableSetOf<String>()
isTopLevel = isTopLevel,
suppressFinal = !finalModifier && functionSymbol.isOverride
) + _visibility
modifiers.add( functionSymbol.computeModalityForMethod(
what = PsiModifier.STATIC, isTopLevel = isTopLevel,
`if` = functionSymbol.hasJvmStaticAnnotation() suppressFinal = !finalModifier && functionSymbol.isOverride,
).add( result = modifiers
what = PsiModifier.STRICTFP,
`if` = functionSymbol.hasAnnotation("kotlin/jvm/Strictfp", null)
).add(
what = PsiModifier.SYNCHRONIZED,
`if` = functionSymbol.hasAnnotation("kotlin/jvm/Synchronized", null)
) )
modifiers.add(_visibility)
if (functionSymbol.hasJvmStaticAnnotation()) {
modifiers.add(PsiModifier.STATIC)
}
if (functionSymbol.hasAnnotation("kotlin/jvm/Strictfp", null)) {
modifiers.add(PsiModifier.STRICTFP)
}
if (functionSymbol.hasAnnotation("kotlin/jvm/Synchronized", null)) {
modifiers.add(PsiModifier.SYNCHRONIZED)
}
modifiers
} }
private val _isDeprecated: Boolean by lazyPub { private val _isDeprecated: Boolean by lazyPub {
@@ -11,7 +11,6 @@ import com.intellij.openapi.util.TextRange
import com.intellij.psi.* import com.intellij.psi.*
import com.intellij.psi.impl.PsiClassImplUtil import com.intellij.psi.impl.PsiClassImplUtil
import com.intellij.psi.impl.light.LightElement import com.intellij.psi.impl.light.LightElement
import com.intellij.psi.impl.light.LightReferenceListBuilder
import com.intellij.psi.javadoc.PsiDocComment import com.intellij.psi.javadoc.PsiDocComment
import com.intellij.psi.search.SearchScope import com.intellij.psi.search.SearchScope
import org.jetbrains.kotlin.asJava.classes.KotlinSuperTypeListBuilder import org.jetbrains.kotlin.asJava.classes.KotlinSuperTypeListBuilder
@@ -24,11 +23,8 @@ import org.jetbrains.kotlin.idea.KotlinLanguage
import org.jetbrains.kotlin.idea.asJava.basicIsEquivalentTo import org.jetbrains.kotlin.idea.asJava.basicIsEquivalentTo
import org.jetbrains.kotlin.idea.asJava.invalidAccess import org.jetbrains.kotlin.idea.asJava.invalidAccess
import org.jetbrains.kotlin.idea.asJava.mapSupertype import org.jetbrains.kotlin.idea.asJava.mapSupertype
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassKind
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtTypeParameterSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtTypeParameterSymbol
import org.jetbrains.kotlin.idea.frontend.api.types.KtClassType import org.jetbrains.kotlin.idea.frontend.api.types.KtClassType
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
import org.jetbrains.kotlin.psi.KtTypeParameter import org.jetbrains.kotlin.psi.KtTypeParameter
import org.jetbrains.kotlin.psi.psiUtil.startOffset import org.jetbrains.kotlin.psi.psiUtil.startOffset
@@ -65,7 +61,7 @@ internal class FirLightTypeParameter(
role = PsiReferenceList.Role.EXTENDS_LIST role = PsiReferenceList.Role.EXTENDS_LIST
) )
typeParameterSymbol.bounds typeParameterSymbol.upperBounds
.filterIsInstance<KtClassType>() .filterIsInstance<KtClassType>()
.filter { it.classId != StandardClassIds.Any } .filter { it.classId != StandardClassIds.Any }
.mapNotNull { it.mapSupertype(this, kotlinCollectionAsIs = true) } .mapNotNull { it.mapSupertype(this, kotlinCollectionAsIs = true) }
@@ -30,7 +30,7 @@ internal class KtFirTypeParameterSymbol(
override val name: Name get() = firRef.withFir { it.name } override val name: Name get() = firRef.withFir { it.name }
override val bounds: List<KtType> by firRef.withFirAndCache(FirResolvePhase.TYPES) { fir -> override val upperBounds: List<KtType> by firRef.withFirAndCache(FirResolvePhase.TYPES) { fir ->
fir.bounds.map { type -> builder.buildKtType(type) } fir.bounds.map { type -> builder.buildKtType(type) }
} }