[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 override fun createPointer(): KtSymbolPointer<KtTypeParameterSymbol>
abstract val bounds: List<KtType>
abstract val upperBounds: List<KtType>
}
sealed class KtClassLikeSymbol : KtClassifierSymbol(), KtNamedSymbol, KtSymbolWithKind {
@@ -6,11 +6,10 @@
package org.jetbrains.kotlin.idea.asJava
import com.intellij.psi.*
import com.intellij.psi.impl.PsiImplUtil
import org.jetbrains.kotlin.asJava.classes.cannotModify
import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.asJava.elements.*
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotationCall
import org.jetbrains.kotlin.asJava.elements.KtLightElement
import org.jetbrains.kotlin.asJava.elements.KtLightElementBase
import org.jetbrains.kotlin.psi.*
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.PsiElement
import com.intellij.psi.impl.PsiImplUtil
import org.jetbrains.kotlin.psi.KtCallElement
internal class FirLightSimpleAnnotation(
@@ -69,8 +69,8 @@ internal fun KtAnnotatedSymbol.hasDeprecatedAnnotation(annotationUseSiteTarget:
internal fun KtAnnotatedSymbol.hasJvmOverloadsAnnotation(): Boolean =
hasAnnotation("kotlin/jvm/JvmOverloads", null)
internal fun KtAnnotatedSymbol.hasJvmStaticAnnotation(): Boolean =
hasAnnotation("kotlin/jvm/JvmStatic", null)
internal fun KtAnnotatedSymbol.hasJvmStaticAnnotation(annotationUseSiteTarget: AnnotationUseSiteTarget? = null): Boolean =
hasAnnotation("kotlin/jvm/JvmStatic", annotationUseSiteTarget)
internal fun KtAnnotatedSymbol.hasInlineOnlyAnnotation(): Boolean =
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.FirLightPsiJavaCodeReferenceElementWithNoReference
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.symbols.KtEnumEntrySymbol
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.createInnerClasses
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.symbols.*
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolKind
@@ -128,7 +127,7 @@ internal open class FirLightClassForSymbol(
.mapTo(result) {
FirLightFieldForPropertySymbol(
propertySymbol = it,
nameGenerator = nameGenerator,
fieldName = nameGenerator.generateUniqueFieldName(it.name.asString()),
containingClass = this@FirLightClassForSymbol,
lightMemberOrigin = null,
isTopLevel = false,
@@ -19,7 +19,6 @@ import org.jetbrains.kotlin.asJava.elements.KtLightMethod
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fir.symbols.StandardClassIds
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.fir.analyzeWithSymbolAsContext
import org.jetbrains.kotlin.idea.frontend.api.symbols.*
@@ -139,7 +138,7 @@ internal fun FirLightClassBase.createMethods(
containingClass = this@createMethods,
isTopLevel = isTopLevel,
methodIndex = methodIndex++,
argumentsSkipMask = skipMask.clone() as BitSet
argumentsSkipMask = skipMask.copy()
)
)
}
@@ -225,7 +224,7 @@ internal fun FirLightClassBase.createField(
result.add(
FirLightFieldForPropertySymbol(
propertySymbol = declaration,
nameGenerator = nameGenerator,
fieldName = nameGenerator.generateUniqueFieldName(declaration.name.asString()),
containingClass = this,
lightMemberOrigin = null,
isTopLevel = isTopLevel,
@@ -262,7 +261,7 @@ internal fun FirLightClassBase.createInheritanceList(forExtendsList: Boolean, su
}
//TODO Add support for kotlin.collections.
superTypes
superTypes.asSequence()
.filterIsInstance<KtClassType>()
.filter { it.needToAddTypeIntoList() }
.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.
*/
package org.jetbrains.kotlin.idea.asJava.fields
package org.jetbrains.kotlin.idea.asJava
import com.intellij.psi.*
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.fir.declarations.FirResolvePhase
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.util.ifTrue
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
@@ -10,8 +10,6 @@ import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin
import org.jetbrains.kotlin.asJava.classes.KtLightClass
import org.jetbrains.kotlin.asJava.classes.lazyPub
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.psi.KtDeclaration
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.psi.KtDeclaration
internal class FirLightFieldForPropertySymbol(
private val propertySymbol: KtPropertySymbol,
nameGenerator: FieldNameGenerator,
private val fieldName: String,
containingClass: FirLightClassBase,
lightMemberOrigin: LightMemberOrigin?,
isTopLevel: Boolean,
@@ -25,8 +25,6 @@ internal class FirLightFieldForPropertySymbol(
takePropertyVisibility: Boolean
) : FirLightField(containingClass, lightMemberOrigin) {
private val _name: String = nameGenerator.generateUniqueFieldName(propertySymbol.name.asString())
override val kotlinOrigin: KtDeclaration? = propertySymbol.psi as? KtDeclaration
private val _returnedType: PsiType by lazyPub {
@@ -51,37 +49,37 @@ internal class FirLightFieldForPropertySymbol(
override fun getType(): PsiType = _returnedType
override fun getName(): String = _name
override fun getName(): String = fieldName
private val _modifierList: PsiModifierList by lazyPub {
val modifiers = mutableSetOf<String>()
val suppressFinal = !propertySymbol.isVal
val modifiersFromSymbol = propertySymbol.computeModalityForMethod(
propertySymbol.computeModalityForMethod(
isTopLevel = isTopLevel,
suppressFinal = suppressFinal
suppressFinal = suppressFinal,
result = modifiers
)
val basicModifiers = modifiersFromSymbol.add(
what = PsiModifier.STATIC,
`if` = forceStatic
)
if (forceStatic) {
modifiers.add(PsiModifier.STATIC)
}
val visibility =
if (takePropertyVisibility) propertySymbol.computeVisibility(isTopLevel = false) else PsiModifier.PRIVATE
modifiers.add(visibility)
val modifiersWithVisibility = basicModifiers + visibility
val modifiers = modifiersWithVisibility.add(
what = PsiModifier.FINAL,
`if` = !suppressFinal
).add(
what = PsiModifier.TRANSIENT,
`if` = propertySymbol.hasAnnotation("kotlin/jvm/Transient", null)
).add(
what = PsiModifier.VOLATILE,
`if` = propertySymbol.hasAnnotation("kotlin/jvm/Volatile", null)
)
if (!suppressFinal) {
modifiers.add(PsiModifier.FINAL)
}
if (propertySymbol.hasAnnotation("kotlin/jvm/Transient", null)) {
modifiers.add(PsiModifier.TRANSIENT)
}
if (propertySymbol.hasAnnotation("kotlin/jvm/Volatile", null)) {
modifiers.add(PsiModifier.VOLATILE)
}
val nullability = if (visibility != PsiModifier.PRIVATE)
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.types.model.SimpleTypeMarker
import java.text.StringCharacterIterator
import java.util.*
internal fun <L : Any> L.invalidAccess(): Nothing =
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()
}
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(
isTopLevel: Boolean,
suppressFinal: Boolean
): Set<String> {
suppressFinal: Boolean,
result: MutableSet<String>
) {
require(this !is KtClassLikeSymbol)
val modality = mutableSetOf<String>()
computeSimpleModality()?.run {
if (this != PsiModifier.FINAL || !suppressFinal) {
modality.add(this)
result.add(this)
}
}
if (this is KtFunctionSymbol && isExternal) {
modality.add(PsiModifier.NATIVE)
result.add(PsiModifier.NATIVE)
}
if (isTopLevel) {
modality.add(PsiModifier.STATIC)
result.add(PsiModifier.STATIC)
}
return modality
}
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 =
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 isInterfaceMethod = containingClass.isInterface
val modifiers = mutableSetOf<String>()
containingPropertySymbol.computeModalityForMethod(
isTopLevel = isTopLevel,
suppressFinal = isOverrideMethod || isInterfaceMethod,
result = modifiers
)
val visibility = isOverrideMethod.ifTrue {
(containingClass as? FirLightClassForSymbol)
?.tryGetEffectiveVisibility(containingPropertySymbol)
?.toPsiVisibility(isTopLevel)
} ?: propertyAccessorSymbol.computeVisibility(isTopLevel)
modifiers.add(visibility)
val modifiers = containingPropertySymbol.computeModalityForMethod(
isTopLevel = isTopLevel,
suppressFinal = isOverrideMethod || isInterfaceMethod
) + visibility
if (containingPropertySymbol.hasJvmStaticAnnotation(accessorSite)) {
modifiers.add(PsiModifier.STATIC)
}
if (isInterfaceMethod) {
modifiers.add(PsiModifier.ABSTRACT)
}
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 {
@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin
import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.asJava.elements.FirLightIdentifier
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtFunctionLikeSymbol
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.KtDeclaration
import java.util.*
@@ -86,21 +86,27 @@ internal class FirLightSimpleMethodForSymbol(
val finalModifier = kotlinOrigin?.hasModifier(KtTokens.FINAL_KEYWORD) == true
val modifiers = functionSymbol.computeModalityForMethod(
isTopLevel = isTopLevel,
suppressFinal = !finalModifier && functionSymbol.isOverride
) + _visibility
val modifiers = mutableSetOf<String>()
modifiers.add(
what = PsiModifier.STATIC,
`if` = functionSymbol.hasJvmStaticAnnotation()
).add(
what = PsiModifier.STRICTFP,
`if` = functionSymbol.hasAnnotation("kotlin/jvm/Strictfp", null)
).add(
what = PsiModifier.SYNCHRONIZED,
`if` = functionSymbol.hasAnnotation("kotlin/jvm/Synchronized", null)
functionSymbol.computeModalityForMethod(
isTopLevel = isTopLevel,
suppressFinal = !finalModifier && functionSymbol.isOverride,
result = modifiers
)
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 {
@@ -11,7 +11,6 @@ import com.intellij.openapi.util.TextRange
import com.intellij.psi.*
import com.intellij.psi.impl.PsiClassImplUtil
import com.intellij.psi.impl.light.LightElement
import com.intellij.psi.impl.light.LightReferenceListBuilder
import com.intellij.psi.javadoc.PsiDocComment
import com.intellij.psi.search.SearchScope
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.invalidAccess
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.types.KtClassType
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
import org.jetbrains.kotlin.psi.KtTypeParameter
import org.jetbrains.kotlin.psi.psiUtil.startOffset
@@ -65,7 +61,7 @@ internal class FirLightTypeParameter(
role = PsiReferenceList.Role.EXTENDS_LIST
)
typeParameterSymbol.bounds
typeParameterSymbol.upperBounds
.filterIsInstance<KtClassType>()
.filter { it.classId != StandardClassIds.Any }
.mapNotNull { it.mapSupertype(this, kotlinCollectionAsIs = true) }
@@ -30,7 +30,7 @@ internal class KtFirTypeParameterSymbol(
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) }
}