[FIR IDE] HL API Better support of nullability and modality

This commit is contained in:
Igor Yakovlev
2020-11-17 15:00:02 +03:00
parent 4c69043a15
commit 2a8f783393
22 changed files with 115 additions and 56 deletions
@@ -34,7 +34,7 @@ fun ConeClassLikeType.isByte(): Boolean = lookupTag.classId == StandardClassIds.
fun ConeClassLikeType.isBoolean(): Boolean = lookupTag.classId == StandardClassIds.Boolean fun ConeClassLikeType.isBoolean(): Boolean = lookupTag.classId == StandardClassIds.Boolean
fun ConeClassLikeType.isChar(): Boolean = lookupTag.classId == StandardClassIds.Char fun ConeClassLikeType.isChar(): Boolean = lookupTag.classId == StandardClassIds.Char
fun ConeClassLikeType.isPrimitiveType(): Boolean = isPrimitiveNumberOrUnsignedNumberType() || isBoolean() || isByte() || isShort() fun ConeClassLikeType.isPrimitiveType(): Boolean = isPrimitiveNumberOrUnsignedNumberType() || isBoolean() || isByte() || isShort() || isChar()
fun ConeClassLikeType.isPrimitiveNumberType(): Boolean = lookupTag.classId in PRIMITIVE_NUMBER_CLASS_IDS fun ConeClassLikeType.isPrimitiveNumberType(): Boolean = lookupTag.classId in PRIMITIVE_NUMBER_CLASS_IDS
fun ConeClassLikeType.isPrimitiveUnsignedNumberType(): Boolean = lookupTag.classId in PRIMITIVE_UNSIGNED_NUMBER_CLASS_IDS fun ConeClassLikeType.isPrimitiveUnsignedNumberType(): Boolean = lookupTag.classId in PRIMITIVE_UNSIGNED_NUMBER_CLASS_IDS
fun ConeClassLikeType.isPrimitiveNumberOrUnsignedNumberType(): Boolean = isPrimitiveNumberType() || isPrimitiveUnsignedNumberType() fun ConeClassLikeType.isPrimitiveNumberOrUnsignedNumberType(): Boolean = isPrimitiveNumberType() || isPrimitiveUnsignedNumberType()
@@ -9,4 +9,6 @@ enum class E {
Entry2, Entry2,
@Deprecated("b") @Deprecated("b")
Entry3 Entry3
} }
// FIR_COMPARISON
@@ -9,3 +9,5 @@ interface Bar : Foo {
} }
enum class EnumNameOverride : Bar enum class EnumNameOverride : Bar
// FIR_COMPARISON
@@ -44,4 +44,6 @@ class Container {
TODO("not implemented") TODO("not implemented")
} }
} }
} }
// FIR_COMPARISON
@@ -13,4 +13,5 @@ class C : A(), I {
override fun if() = 5 override fun if() = 5
} }
// LAZINESS:NoLaziness // LAZINESS:NoLaziness
// FIR_COMPARISON
@@ -20,4 +20,6 @@ interface Primitives {
val long: Long val long: Long
val float: Float val float: Float
val double: Double val double: Double
} }
// FIR_COMPARISON
@@ -29,3 +29,5 @@ private class Private {
override val overridesNothing: Boolean override val overridesNothing: Boolean
get() = false get() = false
} }
// FIR_COMPARISON
@@ -2,3 +2,5 @@
val a: Collection<*> = emptyList() val a: Collection<*> = emptyList()
@JvmField @JvmField
var b: Int = 1 var b: Int = 1
// FIR_COMPARISON
@@ -14,6 +14,7 @@ sealed class KtPropertyAccessorSymbol : KtCallableSymbol(),
abstract val isDefault: Boolean abstract val isDefault: Boolean
abstract val isInline: Boolean abstract val isInline: Boolean
abstract val isOverride: Boolean abstract val isOverride: Boolean
abstract val hasBody: Boolean
abstract val symbolKind: KtSymbolKind abstract val symbolKind: KtSymbolKind
@@ -53,6 +53,8 @@ abstract class KtPropertySymbol : KtVariableSymbol(),
abstract val hasBackingField: Boolean abstract val hasBackingField: Boolean
abstract val isLateInit: Boolean
abstract val isConst: Boolean abstract val isConst: Boolean
abstract val isOverride: Boolean abstract val isOverride: Boolean
@@ -87,7 +87,8 @@ internal fun KtAnnotatedSymbol.hasAnnotation(classIdString: String, annotationUs
internal fun KtAnnotatedSymbol.computeAnnotations( internal fun KtAnnotatedSymbol.computeAnnotations(
parent: PsiElement, parent: PsiElement,
nullability: NullabilityType, nullability: NullabilityType,
annotationUseSiteTarget: AnnotationUseSiteTarget? annotationUseSiteTarget: AnnotationUseSiteTarget?,
includeAnnotationsWithoutSite: Boolean = true
): List<PsiAnnotation> { ): List<PsiAnnotation> {
if (nullability == NullabilityType.Unknown && annotations.isEmpty()) return emptyList() if (nullability == NullabilityType.Unknown && annotations.isEmpty()) return emptyList()
@@ -108,7 +109,10 @@ internal fun KtAnnotatedSymbol.computeAnnotations(
for (annotation in annotations) { for (annotation in annotations) {
val siteTarget = annotation.useSiteTarget val siteTarget = annotation.useSiteTarget
if (siteTarget == null || siteTarget == annotationUseSiteTarget) {
if ((includeAnnotationsWithoutSite && siteTarget == null) ||
siteTarget == annotationUseSiteTarget
) {
result.add(FirLightAnnotationForAnnotationCall(annotation, parent)) result.add(FirLightAnnotationForAnnotationCall(annotation, parent))
} }
} }
@@ -13,9 +13,15 @@ import com.intellij.psi.impl.light.LightModifierList
import org.jetbrains.annotations.NonNls import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.asJava.classes.* import org.jetbrains.kotlin.asJava.classes.*
import org.jetbrains.kotlin.asJava.elements.* import org.jetbrains.kotlin.asJava.elements.*
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade
import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.asJava.elements.FakeFileForLightClass
import org.jetbrains.kotlin.asJava.elements.KtLightField
import org.jetbrains.kotlin.asJava.elements.KtLightMethod
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.isConst
import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.idea.KotlinLanguage
import org.jetbrains.kotlin.idea.asJava.classes.createFields import org.jetbrains.kotlin.idea.asJava.classes.createFields
import org.jetbrains.kotlin.idea.asJava.classes.createMethods import org.jetbrains.kotlin.idea.asJava.classes.createMethods
@@ -23,7 +29,9 @@ import org.jetbrains.kotlin.idea.frontend.api.analyze
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol
import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtNamedDeclaration
import org.jetbrains.kotlin.psi.psiUtil.isPrivate import org.jetbrains.kotlin.psi.psiUtil.isPrivate
class FirLightClassForFacade( class FirLightClassForFacade(
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.idea.frontend.api.analyze
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.KtAnnotatedSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotatedSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtCommonSymbolModality import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtCommonSymbolModality
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolVisibility
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithVisibility import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithVisibility
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
@@ -147,11 +148,17 @@ internal fun FirLightClassBase.createMethods(
is KtPropertySymbol -> { is KtPropertySymbol -> {
if (declaration.hasJvmFieldAnnotation()) continue if (declaration.hasJvmFieldAnnotation()) continue
if (declaration.visibility == KtSymbolVisibility.PRIVATE) continue
fun KtPropertyAccessorSymbol.needToCreateAccessor(siteTarget: AnnotationUseSiteTarget): Boolean {
if (isInline) return false
if (!hasBody && visibility == KtSymbolVisibility.PRIVATE) return false
return !declaration.hasJvmSyntheticAnnotation(siteTarget)
&& !declaration.isHiddenByDeprecation(siteTarget)
}
val getter = declaration.getter?.takeIf { val getter = declaration.getter?.takeIf {
!declaration.hasJvmSyntheticAnnotation(AnnotationUseSiteTarget.PROPERTY_GETTER) && it.needToCreateAccessor(AnnotationUseSiteTarget.PROPERTY_GETTER)
!it.isInline &&
!declaration.isHiddenByDeprecation(AnnotationUseSiteTarget.PROPERTY_GETTER)
} }
if (getter != null) { if (getter != null) {
@@ -167,10 +174,7 @@ internal fun FirLightClassBase.createMethods(
} }
val setter = declaration.setter?.takeIf { val setter = declaration.setter?.takeIf {
!isAnnotationType && !isAnnotationType && it.needToCreateAccessor(AnnotationUseSiteTarget.PROPERTY_SETTER)
!declaration.hasJvmSyntheticAnnotation(AnnotationUseSiteTarget.PROPERTY_SETTER) &&
!it.isInline &&
!declaration.isHiddenByDeprecation(AnnotationUseSiteTarget.PROPERTY_GETTER)
} }
if (setter != null) { if (setter != null) {
@@ -194,13 +198,19 @@ internal fun FirLightClassBase.createFields(
isTopLevel: Boolean, isTopLevel: Boolean,
result: MutableList<KtLightField> result: MutableList<KtLightField>
) { ) {
fun hasBackingField(property: KtPropertySymbol): Boolean {
if (property.modality == KtCommonSymbolModality.ABSTRACT) return false
if (property.isLateInit) return true
//IS PARAMETER -> true
if (property.getter == null && property.setter == null) return true
if (property.hasJvmSyntheticAnnotation(AnnotationUseSiteTarget.FIELD)) return false
return property.hasBackingField
}
//TODO isHiddenByDeprecation //TODO isHiddenByDeprecation
for (declaration in declarations) { for (declaration in declarations) {
if (declaration !is KtPropertySymbol) continue if (declaration !is KtPropertySymbol) continue
if (!hasBackingField(declaration)) continue
if (!declaration.hasBackingField) continue
if (declaration.hasJvmSyntheticAnnotation(AnnotationUseSiteTarget.FIELD)) continue
if (declaration.modality == KtCommonSymbolModality.ABSTRACT) continue
result.add( result.add(
FirLightFieldForPropertySymbol( FirLightFieldForPropertySymbol(
@@ -42,7 +42,7 @@ internal class FirLightFieldForPropertySymbol(
private val _modifierList: PsiModifierList by lazyPub { private val _modifierList: PsiModifierList by lazyPub {
val isJvmField = propertySymbol.hasJvmFieldAnnotation() val isJvmField = propertySymbol.hasJvmFieldAnnotation()
val suppressFinal = !isJvmField && !propertySymbol.isVal val suppressFinal = !propertySymbol.isVal
val modifiersFromSymbol = propertySymbol.computeModalityForMethod( val modifiersFromSymbol = propertySymbol.computeModalityForMethod(
isTopLevel = isTopLevel, isTopLevel = isTopLevel,
@@ -64,9 +64,13 @@ internal class FirLightFieldForPropertySymbol(
`if` = !suppressFinal `if` = !suppressFinal
) )
val nullability = if (visibility != PsiModifier.PRIVATE)
propertySymbol.type.getTypeNullability(propertySymbol, FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE)
else NullabilityType.Unknown
val annotations = propertySymbol.computeAnnotations( val annotations = propertySymbol.computeAnnotations(
parent = this, parent = this,
nullability = propertySymbol.type.getTypeNullability(propertySymbol, FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE), nullability = nullability,
annotationUseSiteTarget = AnnotationUseSiteTarget.FIELD, annotationUseSiteTarget = AnnotationUseSiteTarget.FIELD,
) )
@@ -45,7 +45,7 @@ internal class FirLightAccessorMethodForSymbol(
val defaultName = containingPropertySymbol.name.identifier.let { val defaultName = containingPropertySymbol.name.identifier.let {
if (containingClass.isAnnotationType) it else it.abiName(propertyAccessorSymbol) if (containingClass.isAnnotationType) it else it.abiName(propertyAccessorSymbol)
} }
containingPropertySymbol.computeJvmMethodName(defaultName, accessorSite) containingPropertySymbol.computeJvmMethodName(defaultName, containingClass, accessorSite)
} }
override fun getName(): String = _name override fun getName(): String = _name
@@ -61,9 +61,11 @@ internal class FirLightAccessorMethodForSymbol(
else AnnotationUseSiteTarget.PROPERTY_SETTER else AnnotationUseSiteTarget.PROPERTY_SETTER
private val _annotations: List<PsiAnnotation> by lazyPub { private val _annotations: List<PsiAnnotation> by lazyPub {
val nullabilityType = containingPropertySymbol.type
.getTypeNullability(containingPropertySymbol, FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE)
containingPropertySymbol.computeAnnotations( containingPropertySymbol.computeAnnotations(
parent = this, parent = this,
nullability = NullabilityType.Unknown, nullability = nullabilityType,
annotationUseSiteTarget = accessorSite, annotationUseSiteTarget = accessorSite,
) )
} }
@@ -17,9 +17,11 @@ import org.jetbrains.kotlin.asJava.classes.cannotModify
import org.jetbrains.kotlin.asJava.elements.KtLightMethod import org.jetbrains.kotlin.asJava.elements.KtLightMethod
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotatedSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotatedSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolVisibility import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolVisibility
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithVisibility import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithVisibility
import org.jetbrains.kotlin.idea.util.ifTrue
import org.jetbrains.kotlin.idea.util.module import org.jetbrains.kotlin.idea.util.module
internal abstract class FirLightMethod( internal abstract class FirLightMethod(
@@ -83,11 +85,16 @@ internal abstract class FirLightMethod(
protected fun <T> T.computeJvmMethodName( protected fun <T> T.computeJvmMethodName(
defaultName: String, defaultName: String,
containingClass: FirLightClassBase,
annotationUseSiteTarget: AnnotationUseSiteTarget? = null annotationUseSiteTarget: AnnotationUseSiteTarget? = null
): String where T : KtAnnotatedSymbol, T : KtSymbolWithVisibility { ): String where T : KtAnnotatedSymbol, T : KtSymbolWithVisibility, T : KtCallableSymbol {
getJvmNameFromAnnotation(annotationUseSiteTarget)?.let { return it } getJvmNameFromAnnotation(annotationUseSiteTarget)?.let { return it }
if (visibility != KtSymbolVisibility.INTERNAL) return defaultName val effectiveVisibilityIfNotInternal = (visibility != KtSymbolVisibility.INTERNAL).ifTrue {
(containingClass as? FirLightClassForSymbol)?.tryGetEffectiveVisibility(this)
} ?: this.visibility
if (effectiveVisibilityIfNotInternal != KtSymbolVisibility.INTERNAL) return defaultName
val moduleName = module?.name ?: return defaultName val moduleName = module?.name ?: return defaultName
@@ -34,14 +34,16 @@ internal class FirLightSimpleMethodForSymbol(
) { ) {
private val _name: String by lazyPub { private val _name: String by lazyPub {
functionSymbol.computeJvmMethodName(functionSymbol.name.asString()) functionSymbol.computeJvmMethodName(functionSymbol.name.asString(), containingClass)
} }
override fun getName(): String = _name override fun getName(): String = _name
private val _annotations: List<PsiAnnotation> by lazyPub { private val _annotations: List<PsiAnnotation> by lazyPub {
val nullability = if (functionSymbol.type.isUnit) NullabilityType.Unknown else functionSymbol.type.getTypeNullability( val needUnknownNullability = functionSymbol.type.isUnit || (_visibility == PsiModifier.PRIVATE)
val nullability = if (needUnknownNullability) NullabilityType.Unknown else functionSymbol.type.getTypeNullability(
functionSymbol, functionSymbol,
FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE
) )
@@ -53,29 +55,24 @@ internal class FirLightSimpleMethodForSymbol(
) )
} }
open class X { private val _visibility: String by lazyPub {
open val x: Int = 2 functionSymbol.isOverride.ifTrue {
open fun u() = 2 (containingClass as? FirLightClassForSymbol)
?.tryGetEffectiveVisibility(functionSymbol)
?.toPsiVisibility(isTopLevel)
} ?: functionSymbol.computeVisibility(isTopLevel = isTopLevel)
} }
private val _modifiers: Set<String> by lazyPub { private val _modifiers: Set<String> by lazyPub {
if (functionSymbol.hasInlineOnlyAnnotation()) return@lazyPub setOf(PsiModifier.FINAL, PsiModifier.PRIVATE) if (functionSymbol.hasInlineOnlyAnnotation()) return@lazyPub setOf(PsiModifier.FINAL, PsiModifier.PRIVATE)
val isOverrideMethod = functionSymbol.isOverride
val visibility = isOverrideMethod.ifTrue {
(containingClass as? FirLightClassForSymbol)
?.tryGetEffectiveVisibility(functionSymbol)
?.toPsiVisibility(isTopLevel)
} ?: functionSymbol.computeVisibility(isTopLevel = isTopLevel)
val finalModifier = kotlinOrigin?.hasModifier(KtTokens.FINAL_KEYWORD) == true val finalModifier = kotlinOrigin?.hasModifier(KtTokens.FINAL_KEYWORD) == true
val modifiers = functionSymbol.computeModalityForMethod( val modifiers = functionSymbol.computeModalityForMethod(
isTopLevel = isTopLevel, isTopLevel = isTopLevel,
suppressFinal = !finalModifier && isOverrideMethod suppressFinal = !finalModifier && functionSymbol.isOverride
) + visibility ) + _visibility
modifiers.add( modifiers.add(
what = PsiModifier.STATIC, what = PsiModifier.STATIC,
@@ -7,8 +7,11 @@ package org.jetbrains.kotlin.idea.asJava
import com.intellij.psi.* import com.intellij.psi.*
import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtParameterSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtParameterSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolKind
import org.jetbrains.kotlin.idea.util.ifTrue
import org.jetbrains.kotlin.psi.KtParameter import org.jetbrains.kotlin.psi.KtParameter
internal class FirLightParameterForSymbol( internal class FirLightParameterForSymbol(
@@ -26,10 +29,15 @@ internal class FirLightParameterForSymbol(
override val kotlinOrigin: KtParameter? = parameterSymbol.psi as? KtParameter override val kotlinOrigin: KtParameter? = parameterSymbol.psi as? KtParameter
private val _annotations: List<PsiAnnotation> by lazyPub { private val _annotations: List<PsiAnnotation> by lazyPub {
val annotationSite = (containingMethod.isConstructor && parameterSymbol.symbolKind == KtSymbolKind.MEMBER).ifTrue {
AnnotationUseSiteTarget.CONSTRUCTOR_PARAMETER
}
parameterSymbol.computeAnnotations( parameterSymbol.computeAnnotations(
parent = this, parent = this,
nullability = parameterSymbol.type.getTypeNullability(parameterSymbol, FirResolvePhase.TYPES), nullability = parameterSymbol.type.getTypeNullability(parameterSymbol, FirResolvePhase.TYPES),
annotationUseSiteTarget = null, annotationUseSiteTarget = annotationSite,
includeAnnotationsWithoutSite = false
) )
} }
@@ -50,9 +58,7 @@ internal class FirLightParameterForSymbol(
override fun equals(other: Any?): Boolean = override fun equals(other: Any?): Boolean =
this === other || this === other ||
(other is FirLightParameterForSymbol && (other is FirLightParameterForSymbol && parameterSymbol == other.parameterSymbol)
kotlinOrigin == other.kotlinOrigin &&
parameterSymbol == other.parameterSymbol)
override fun hashCode(): Int = kotlinOrigin.hashCode() override fun hashCode(): Int = kotlinOrigin.hashCode()
} }
@@ -39,6 +39,7 @@ internal class KtFirPropertyGetterSymbol(
override val isDefault: Boolean get() = firRef.withFir { it is FirDefaultPropertyAccessor } override val isDefault: Boolean get() = firRef.withFir { it is FirDefaultPropertyAccessor }
override val isInline: Boolean get() = firRef.withFir { it.isInline } override val isInline: Boolean get() = firRef.withFir { it.isInline }
override val isOverride: Boolean get() = firRef.withFir { it.isOverride } override val isOverride: Boolean get() = firRef.withFir { it.isOverride }
override val hasBody: Boolean get() = firRef.withFir { it.body != null }
override val symbolKind: KtSymbolKind override val symbolKind: KtSymbolKind
get() = firRef.withFir { fir -> get() = firRef.withFir { fir ->
@@ -39,6 +39,8 @@ internal class KtFirPropertySetterSymbol(
override val isDefault: Boolean get() = firRef.withFir { it is FirDefaultPropertyAccessor } override val isDefault: Boolean get() = firRef.withFir { it is FirDefaultPropertyAccessor }
override val isInline: Boolean get() = firRef.withFir { it.isInline } override val isInline: Boolean get() = firRef.withFir { it.isInline }
override val isOverride: Boolean get() = firRef.withFir { it.isOverride } override val isOverride: Boolean get() = firRef.withFir { it.isOverride }
override val hasBody: Boolean get() = firRef.withFir { it.body != null }
override val modality: KtCommonSymbolModality get() = firRef.withFir(FirResolvePhase.STATUS) { it.modality.getSymbolModality() } override val modality: KtCommonSymbolModality get() = firRef.withFir(FirResolvePhase.STATUS) { it.modality.getSymbolModality() }
override val visibility: KtSymbolVisibility get() = firRef.withFir(FirResolvePhase.STATUS) { it.visibility.getSymbolVisibility() } override val visibility: KtSymbolVisibility get() = firRef.withFir(FirResolvePhase.STATUS) { it.visibility.getSymbolVisibility() }
override val parameter: KtSetterParameterSymbol by firRef.withFirAndCache { fir -> override val parameter: KtSetterParameterSymbol by firRef.withFirAndCache { fir ->
@@ -80,6 +80,8 @@ internal class KtFirPropertySymbol(
override val hasBackingField: Boolean get() = firRef.withFir { it.hasBackingField } override val hasBackingField: Boolean get() = firRef.withFir { it.hasBackingField }
override val isLateInit: Boolean get() = firRef.withFir { it.isLateInit }
override val isConst: Boolean get() = firRef.withFir { it.isConst } override val isConst: Boolean get() = firRef.withFir { it.isConst }
override val isOverride: Boolean get() = firRef.withFir { it.isOverride } override val isOverride: Boolean get() = firRef.withFir { it.isOverride }
@@ -151,12 +151,10 @@ fun findClass(fqName: String, ktFile: KtFile?, project: Project): PsiClass? {
return it.toLightClass() return it.toLightClass()
} }
return JavaPsiFacade.getInstance(project).findClass(fqName, GlobalSearchScope.allScope(project)) ?: PsiTreeUtil.findChildrenOfType( return JavaPsiFacade.getInstance(project).findClass(fqName, GlobalSearchScope.allScope(project))
ktFile, ?: PsiTreeUtil.findChildrenOfType(ktFile, KtClassOrObject::class.java)
KtClassOrObject::class.java .find { fqName.endsWith(it.nameAsName!!.asString()) }
) ?.toLightClass()
.find { fqName.endsWith(it.nameAsName!!.asString()) }
?.let { KtLightClassForSourceDeclaration.create(it) }
} }
object LightClassLazinessChecker { object LightClassLazinessChecker {
@@ -276,11 +274,13 @@ object LightClassLazinessChecker {
// see KtLightNullabilityAnnotation // see KtLightNullabilityAnnotation
assertTrue( assertTrue(
lightAnnotations.isNotEmpty(), lightAnnotations.isNotEmpty(),
"Missing $fqName annotation in '${modifierListOwner}' have only ${annotations?.joinToString( "Missing $fqName annotation in '${modifierListOwner}' have only ${
", ", annotations?.joinToString(
"[", ", ",
"]" "[",
) { it.toString() }}" "]"
) { it.toString() }
}"
) )
} }
clsAnnotations.zip(lightAnnotations).forEach { (clsAnnotation, lightAnnotation) -> clsAnnotations.zip(lightAnnotations).forEach { (clsAnnotation, lightAnnotation) ->