[FIR IDE] LC More accurate fields visibility and modality
This commit is contained in:
+1
-1
@@ -116,7 +116,7 @@ class FirLightClassForFacade(
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (propertySymbol in propertySymbols) {
|
for (propertySymbol in propertySymbols) {
|
||||||
val forceStaticAndPropertyVisibility = propertySymbol.hasJvmStaticAnnotation()
|
val forceStaticAndPropertyVisibility = propertySymbol.isConst || propertySymbol.hasJvmFieldAnnotation()
|
||||||
createField(
|
createField(
|
||||||
propertySymbol,
|
propertySymbol,
|
||||||
nameGenerator,
|
nameGenerator,
|
||||||
|
|||||||
+14
-32
@@ -19,6 +19,7 @@ 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
|
||||||
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.load.java.JvmAbi
|
||||||
|
|
||||||
internal open class FirLightClassForSymbol(
|
internal open class FirLightClassForSymbol(
|
||||||
private val classOrObjectSymbol: KtClassOrObjectSymbol,
|
private val classOrObjectSymbol: KtClassOrObjectSymbol,
|
||||||
@@ -118,20 +119,20 @@ internal open class FirLightClassForSymbol(
|
|||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun addFieldsFromCompanionIfNeeded(result: MutableList<KtLightField>, nameGenerator: FirLightField.FieldNameGenerator) {
|
private fun addFieldsFromCompanionIfNeeded(result: MutableList<KtLightField>) {
|
||||||
classOrObjectSymbol.companionObject?.run {
|
classOrObjectSymbol.companionObject?.run {
|
||||||
analyzeWithSymbolAsContext(this) {
|
analyzeWithSymbolAsContext(this) {
|
||||||
getDeclaredMemberScope().getCallableSymbols()
|
getDeclaredMemberScope().getCallableSymbols()
|
||||||
.filterIsInstance<KtPropertySymbol>()
|
.filterIsInstance<KtPropertySymbol>()
|
||||||
.filter { it.hasJvmFieldAnnotation() || it.isConst }
|
.filter { it.hasJvmFieldAnnotation() || it.hasJvmStaticAnnotation() || it.isConst }
|
||||||
.mapTo(result) {
|
.mapTo(result) {
|
||||||
FirLightFieldForPropertySymbol(
|
FirLightFieldForPropertySymbol(
|
||||||
propertySymbol = it,
|
propertySymbol = it,
|
||||||
fieldName = nameGenerator.generateUniqueFieldName(it.name.asString()),
|
fieldName = it.name.asString(),
|
||||||
containingClass = this@FirLightClassForSymbol,
|
containingClass = this@FirLightClassForSymbol,
|
||||||
lightMemberOrigin = null,
|
lightMemberOrigin = null,
|
||||||
isTopLevel = false,
|
isTopLevel = false,
|
||||||
forceStatic = true,
|
forceStatic = !it.hasJvmStaticAnnotation(),
|
||||||
takePropertyVisibility = true
|
takePropertyVisibility = true
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -139,23 +140,6 @@ internal open class FirLightClassForSymbol(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private fun addObjectFields(result: MutableList<KtLightField>, nameGenerator: FirLightField.FieldNameGenerator) {
|
|
||||||
analyzeWithSymbolAsContext(classOrObjectSymbol) {
|
|
||||||
classOrObjectSymbol.getDeclaredMemberScope().getAllSymbols()
|
|
||||||
.filterIsInstance<KtClassOrObjectSymbol>()
|
|
||||||
.filter { it.classKind == KtClassKind.OBJECT }
|
|
||||||
.mapTo(result) {
|
|
||||||
FirLightFieldForObjectSymbol(
|
|
||||||
objectSymbol = it,
|
|
||||||
containingClass = this@FirLightClassForSymbol,
|
|
||||||
name = nameGenerator.generateUniqueFieldName(it.name.asString()),
|
|
||||||
lightMemberOrigin = null
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun addInstanceFieldIfNeeded(result: MutableList<KtLightField>) {
|
private fun addInstanceFieldIfNeeded(result: MutableList<KtLightField>) {
|
||||||
val isNamedObject = classOrObjectSymbol.classKind == KtClassKind.OBJECT
|
val isNamedObject = classOrObjectSymbol.classKind == KtClassKind.OBJECT
|
||||||
if (isNamedObject && classOrObjectSymbol.symbolKind != KtSymbolKind.LOCAL) {
|
if (isNamedObject && classOrObjectSymbol.symbolKind != KtSymbolKind.LOCAL) {
|
||||||
@@ -163,14 +147,14 @@ internal open class FirLightClassForSymbol(
|
|||||||
FirLightFieldForObjectSymbol(
|
FirLightFieldForObjectSymbol(
|
||||||
objectSymbol = classOrObjectSymbol,
|
objectSymbol = classOrObjectSymbol,
|
||||||
containingClass = this@FirLightClassForSymbol,
|
containingClass = this@FirLightClassForSymbol,
|
||||||
name = "INSTANCE",
|
name = JvmAbi.INSTANCE_FIELD,
|
||||||
lightMemberOrigin = null
|
lightMemberOrigin = null
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun addPropertyBackingFields(result: MutableList<KtLightField>, nameGenerator: FirLightField.FieldNameGenerator) {
|
private fun addPropertyBackingFields(result: MutableList<KtLightField>) {
|
||||||
analyzeWithSymbolAsContext(classOrObjectSymbol) {
|
analyzeWithSymbolAsContext(classOrObjectSymbol) {
|
||||||
val propertySymbols = classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols()
|
val propertySymbols = classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols()
|
||||||
.filterIsInstance<KtPropertySymbol>()
|
.filterIsInstance<KtPropertySymbol>()
|
||||||
@@ -178,12 +162,15 @@ internal open class FirLightClassForSymbol(
|
|||||||
filterNot { it.hasJvmFieldAnnotation() || it.isConst }
|
filterNot { it.hasJvmFieldAnnotation() || it.isConst }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val nameGenerator = FirLightField.FieldNameGenerator()
|
||||||
val isObject = classOrObjectSymbol.classKind == KtClassKind.OBJECT
|
val isObject = classOrObjectSymbol.classKind == KtClassKind.OBJECT
|
||||||
|
val isCompanionObject = classOrObjectSymbol.classKind == KtClassKind.COMPANION_OBJECT
|
||||||
|
|
||||||
for (propertySymbol in propertySymbols) {
|
for (propertySymbol in propertySymbols) {
|
||||||
|
val isJvmField = propertySymbol.hasJvmFieldAnnotation()
|
||||||
val isJvmStatic = propertySymbol.hasJvmStaticAnnotation()
|
val isJvmStatic = propertySymbol.hasJvmStaticAnnotation()
|
||||||
val forceStatic = isObject || isJvmStatic
|
val forceStatic = isObject && (propertySymbol.isConst || isJvmStatic || isJvmField)
|
||||||
val takePropertyVisibility = (isObject && propertySymbol.isConst) || isJvmStatic
|
val takePropertyVisibility = !isCompanionObject && (isJvmField || (isObject && isJvmStatic))
|
||||||
|
|
||||||
createField(
|
createField(
|
||||||
declaration = propertySymbol,
|
declaration = propertySymbol,
|
||||||
@@ -195,8 +182,6 @@ internal open class FirLightClassForSymbol(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (isEnum) {
|
if (isEnum) {
|
||||||
classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols()
|
classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols()
|
||||||
.filterIsInstance<KtEnumEntrySymbol>()
|
.filterIsInstance<KtEnumEntrySymbol>()
|
||||||
@@ -212,11 +197,8 @@ internal open class FirLightClassForSymbol(
|
|||||||
addCompanionObjectFieldIfNeeded(result)
|
addCompanionObjectFieldIfNeeded(result)
|
||||||
addInstanceFieldIfNeeded(result)
|
addInstanceFieldIfNeeded(result)
|
||||||
|
|
||||||
val nameGenerator = FirLightField.FieldNameGenerator()
|
addFieldsFromCompanionIfNeeded(result)
|
||||||
|
addPropertyBackingFields(result)
|
||||||
addObjectFields(result, nameGenerator)
|
|
||||||
addFieldsFromCompanionIfNeeded(result, nameGenerator)
|
|
||||||
addPropertyBackingFields(result, nameGenerator)
|
|
||||||
|
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|||||||
+2
@@ -97,6 +97,8 @@ internal class FirLightFieldForPropertySymbol(
|
|||||||
override fun getModifierList(): PsiModifierList = _modifierList
|
override fun getModifierList(): PsiModifierList = _modifierList
|
||||||
|
|
||||||
private val _initializer by lazyPub {
|
private val _initializer by lazyPub {
|
||||||
|
if (!propertySymbol.isConst) return@lazyPub null
|
||||||
|
if (!propertySymbol.isVal) return@lazyPub null
|
||||||
(propertySymbol.initializer as? KtSimpleConstantValue<*>)?.createPsiLiteral(this)
|
(propertySymbol.initializer as? KtSimpleConstantValue<*>)?.createPsiLiteral(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user