[FIR IDE] LC Fix generating unique field names
This commit is contained in:
@@ -13,3 +13,5 @@ class A {
|
||||
private val j: String = { "a" }()
|
||||
private val j: String = { "b" }()
|
||||
}
|
||||
|
||||
// FIR_COMPARISON
|
||||
+4
-2
@@ -114,6 +114,7 @@ class FirLightClassForFacade(
|
||||
|
||||
private fun loadFieldsFromFile(
|
||||
file: KtFile,
|
||||
usedFieldNames: MutableSet<String>,
|
||||
result: MutableList<KtLightField>
|
||||
) {
|
||||
|
||||
@@ -130,13 +131,14 @@ class FirLightClassForFacade(
|
||||
}
|
||||
}
|
||||
|
||||
createFields(symbols.asSequence(), isTopLevel = true, result)
|
||||
createFields(symbols.asSequence(), usedFieldNames, isTopLevel = true, result)
|
||||
}
|
||||
|
||||
private val _ownFields: List<KtLightField> by lazyPub {
|
||||
val result = mutableListOf<KtLightField>()
|
||||
val usedFieldNames = mutableSetOf<String>()
|
||||
for (file in files) {
|
||||
loadFieldsFromFile(file, result)
|
||||
loadFieldsFromFile(file, usedFieldNames, result)
|
||||
}
|
||||
result
|
||||
}
|
||||
|
||||
+4
-1
@@ -133,6 +133,8 @@ internal class FirLightClassForSymbol(
|
||||
|
||||
result.addCompanionObjectFieldIfNeeded()
|
||||
|
||||
val usedNames = mutableSetOf<String>()
|
||||
|
||||
classOrObjectSymbol.companionObject?.run {
|
||||
analyzeWithSymbolAsContext(this) {
|
||||
getDeclaredMemberScope().getCallableSymbols()
|
||||
@@ -141,6 +143,7 @@ internal class FirLightClassForSymbol(
|
||||
.mapTo(result) {
|
||||
FirLightFieldForPropertySymbol(
|
||||
propertySymbol = it,
|
||||
usedNames = usedNames,
|
||||
containingClass = this@FirLightClassForSymbol,
|
||||
lightMemberOrigin = null,
|
||||
isTopLevel = false,
|
||||
@@ -161,7 +164,7 @@ internal class FirLightClassForSymbol(
|
||||
.applyIf(classOrObjectSymbol.classKind == KtClassKind.COMPANION_OBJECT) {
|
||||
filterNot { it.hasJvmFieldAnnotation() || it.isConst }
|
||||
}
|
||||
createFields(propertySymbols, isTopLevel = false, result)
|
||||
createFields(propertySymbols, usedNames, isTopLevel = false, result)
|
||||
|
||||
if (isEnum) {
|
||||
classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols()
|
||||
|
||||
+6
-10
@@ -10,29 +10,24 @@ import com.intellij.psi.util.CachedValuesManager
|
||||
import org.jetbrains.kotlin.analyzer.KotlinModificationTrackerService
|
||||
import org.jetbrains.kotlin.asJava.classes.KtLightClass
|
||||
import org.jetbrains.kotlin.asJava.classes.METHOD_INDEX_BASE
|
||||
import org.jetbrains.kotlin.asJava.classes.safeIsLocal
|
||||
import org.jetbrains.kotlin.asJava.classes.shouldNotBeVisibleAsLightClass
|
||||
import org.jetbrains.kotlin.asJava.elements.KtLightField
|
||||
import org.jetbrains.kotlin.asJava.elements.KtLightMethod
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
||||
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.fields.FirLightFieldForEnumEntry
|
||||
import org.jetbrains.kotlin.idea.frontend.api.analyze
|
||||
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirSymbol
|
||||
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef
|
||||
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.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.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||
import org.jetbrains.kotlin.psi.KtCodeFragment
|
||||
import org.jetbrains.kotlin.psi.KtEnumEntry
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.psi.psiUtil.containingClass
|
||||
import org.jetbrains.kotlin.psi.psiUtil.isLambdaOutsideParentheses
|
||||
import org.jetbrains.kotlin.psi.psiUtil.isObjectLiteral
|
||||
import org.jetbrains.kotlin.util.containingNonLocalDeclaration
|
||||
import java.util.*
|
||||
|
||||
fun getOrCreateFirLightClass(classOrObject: KtClassOrObject): KtLightClass? =
|
||||
@@ -199,6 +194,7 @@ internal fun FirLightClassBase.createMethods(
|
||||
|
||||
internal fun FirLightClassBase.createFields(
|
||||
declarations: Sequence<KtCallableSymbol>,
|
||||
usedNames: MutableSet<String>,
|
||||
isTopLevel: Boolean,
|
||||
result: MutableList<KtLightField>
|
||||
) {
|
||||
@@ -211,7 +207,6 @@ internal fun FirLightClassBase.createFields(
|
||||
return property.hasBackingField
|
||||
}
|
||||
|
||||
//TODO isHiddenByDeprecation
|
||||
for (declaration in declarations) {
|
||||
if (declaration !is KtPropertySymbol) continue
|
||||
if (!hasBackingField(declaration)) continue
|
||||
@@ -219,6 +214,7 @@ internal fun FirLightClassBase.createFields(
|
||||
result.add(
|
||||
FirLightFieldForPropertySymbol(
|
||||
propertySymbol = declaration,
|
||||
usedNames = usedNames,
|
||||
containingClass = this@createFields,
|
||||
lightMemberOrigin = null,
|
||||
isTopLevel = isTopLevel
|
||||
|
||||
+15
-1
@@ -16,12 +16,15 @@ import org.jetbrains.kotlin.psi.KtDeclaration
|
||||
|
||||
internal class FirLightFieldForPropertySymbol(
|
||||
private val propertySymbol: KtPropertySymbol,
|
||||
usedNames: MutableSet<String>,
|
||||
containingClass: FirLightClassBase,
|
||||
lightMemberOrigin: LightMemberOrigin?,
|
||||
isTopLevel: Boolean,
|
||||
forceStatic: Boolean = false
|
||||
) : FirLightField(containingClass, lightMemberOrigin) {
|
||||
|
||||
private val _name: String = generateUniqueFieldName(usedNames, propertySymbol.name.asString())
|
||||
|
||||
override val kotlinOrigin: KtDeclaration? = propertySymbol.psi as? KtDeclaration
|
||||
|
||||
private val _returnedType: PsiType by lazyPub {
|
||||
@@ -46,7 +49,6 @@ internal class FirLightFieldForPropertySymbol(
|
||||
|
||||
override fun getType(): PsiType = _returnedType
|
||||
|
||||
private val _name = propertySymbol.name.asString()
|
||||
override fun getName(): String = _name
|
||||
|
||||
private val _modifierList: PsiModifierList by lazyPub {
|
||||
@@ -105,4 +107,16 @@ internal class FirLightFieldForPropertySymbol(
|
||||
propertySymbol == other.propertySymbol)
|
||||
|
||||
override fun hashCode(): Int = kotlinOrigin.hashCode()
|
||||
|
||||
companion object {
|
||||
private fun generateUniqueFieldName(usedNames: MutableSet<String>, base: String): String {
|
||||
if (usedNames.add(base)) return base
|
||||
var i = 1
|
||||
while (true) {
|
||||
val suggestion = "$base$$i"
|
||||
if (usedNames.add(suggestion)) return suggestion
|
||||
i++
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user