diff --git a/compiler/testData/asJava/lightClasses/compilationErrors/SameName.kt b/compiler/testData/asJava/lightClasses/compilationErrors/SameName.kt index 95c0dbf1bfe..9412ffcab6a 100644 --- a/compiler/testData/asJava/lightClasses/compilationErrors/SameName.kt +++ b/compiler/testData/asJava/lightClasses/compilationErrors/SameName.kt @@ -13,3 +13,5 @@ class A { private val j: String = { "a" }() private val j: String = { "b" }() } + +// FIR_COMPARISON \ No newline at end of file diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForFacade.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForFacade.kt index b5e01365a3d..bc4ea6706e4 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForFacade.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForFacade.kt @@ -114,6 +114,7 @@ class FirLightClassForFacade( private fun loadFieldsFromFile( file: KtFile, + usedFieldNames: MutableSet, result: MutableList ) { @@ -130,13 +131,14 @@ class FirLightClassForFacade( } } - createFields(symbols.asSequence(), isTopLevel = true, result) + createFields(symbols.asSequence(), usedFieldNames, isTopLevel = true, result) } private val _ownFields: List by lazyPub { val result = mutableListOf() + val usedFieldNames = mutableSetOf() for (file in files) { - loadFieldsFromFile(file, result) + loadFieldsFromFile(file, usedFieldNames, result) } result } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForSymbol.kt index af968dd1d71..0a1db55e788 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForSymbol.kt @@ -133,6 +133,8 @@ internal class FirLightClassForSymbol( result.addCompanionObjectFieldIfNeeded() + val usedNames = mutableSetOf() + 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() diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt index 6d1820eaa56..532f9f595dc 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt @@ -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, + usedNames: MutableSet, isTopLevel: Boolean, result: MutableList ) { @@ -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 diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/fields/FirLightFieldForPropertySymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/fields/FirLightFieldForPropertySymbol.kt index 57b4f436964..7ff8c9546b7 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/fields/FirLightFieldForPropertySymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/fields/FirLightFieldForPropertySymbol.kt @@ -16,12 +16,15 @@ import org.jetbrains.kotlin.psi.KtDeclaration internal class FirLightFieldForPropertySymbol( private val propertySymbol: KtPropertySymbol, + usedNames: MutableSet, 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, 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++ + } + } + } } \ No newline at end of file