[FIR IDE] HL API Better support of nullability and modality
This commit is contained in:
@@ -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
|
||||||
+3
-1
@@ -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
|
||||||
+1
@@ -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
|
||||||
|
|
||||||
|
|||||||
+2
@@ -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
|
||||||
|
|||||||
+6
-2
@@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+10
-2
@@ -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(
|
||||||
|
|||||||
+21
-11
@@ -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(
|
||||||
|
|||||||
+6
-2
@@ -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,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
+4
-2
@@ -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,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-2
@@ -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
|
||||||
|
|
||||||
|
|||||||
+12
-15
@@ -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,
|
||||||
|
|||||||
+10
-4
@@ -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()
|
||||||
}
|
}
|
||||||
+1
@@ -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 ->
|
||||||
|
|||||||
+2
@@ -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 ->
|
||||||
|
|||||||
+2
@@ -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) ->
|
||||||
|
|||||||
Reference in New Issue
Block a user