diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtVariableLikeSymbol.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtVariableLikeSymbol.kt index 03eb7d79919..494b71816ae 100644 --- a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtVariableLikeSymbol.kt +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtVariableLikeSymbol.kt @@ -91,6 +91,7 @@ public sealed class KtPropertySymbol : KtVariableSymbol(), public abstract val hasBackingField: Boolean + public abstract val isFromPrimaryConstructor: Boolean public abstract val isOverride: Boolean public abstract val isStatic: Boolean @@ -138,4 +139,4 @@ public abstract class KtValueParameterSymbol : KtVariableLikeSymbol(), KtSymbolW public abstract val isVararg: Boolean abstract override fun createPointer(): KtSymbolPointer -} \ No newline at end of file +} 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 9aa45d9d571..0151ccdb48a 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 @@ -142,11 +142,12 @@ internal fun FirLightClassBase.createMethods( isTopLevel: Boolean = false, suppressStaticForMethods: Boolean = false ) { - for (declaration in declarations) { + val declarationGroups = declarations.groupBy { it is KtPropertySymbol && it.isFromPrimaryConstructor } + fun handleDeclaration(declaration: KtCallableSymbol) { when (declaration) { is KtFunctionSymbol -> { - if (declaration.isInline || declaration.isHiddenOrSynthetic()) continue + if (declaration.isInline || declaration.isHiddenOrSynthetic()) return var methodIndex = METHOD_INDEX_BASE result.add( @@ -184,14 +185,14 @@ internal fun FirLightClassBase.createMethods( } is KtPropertySymbol -> { - if (declaration is KtKotlinPropertySymbol && declaration.isConst) continue + if (declaration is KtKotlinPropertySymbol && declaration.isConst) return if (declaration.visibility.isPrivateOrPrivateToThis() && declaration.getter?.hasBody == false && declaration.setter?.hasBody == false - ) continue + ) return - if (declaration.hasJvmFieldAnnotation()) continue + if (declaration.hasJvmFieldAnnotation()) return fun KtPropertyAccessorSymbol.needToCreateAccessor(siteTarget: AnnotationUseSiteTarget): Boolean { if (isInline) return false @@ -236,6 +237,15 @@ internal fun FirLightClassBase.createMethods( is KtConstructorSymbol -> error("Constructors should be handled separately and not passed to this function") } } + + // Regular members + declarationGroups[false]?.forEach { + handleDeclaration(it) + } + // Then, properties from the primary constructor parameters + declarationGroups[true]?.forEach { + handleDeclaration(it) + } } internal fun FirLightClassBase.createField( diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirKotlinPropertySymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirKotlinPropertySymbol.kt index 9380e847660..9b68fc70223 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirKotlinPropertySymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirKotlinPropertySymbol.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols import com.intellij.psi.PsiElement import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibility +import org.jetbrains.kotlin.fir.FirFakeSourceElementKind import org.jetbrains.kotlin.fir.containingClass import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty @@ -89,7 +90,6 @@ internal class KtFirKotlinPropertySymbol( override val callableIdIfNonLocal: CallableId? get() = getCallableIdIfNonLocal() - override val getter: KtPropertyGetterSymbol? by firRef.withFirAndCache(FirResolvePhase.RAW_FIR) { property -> property.getter?.let { builder.callableBuilder.buildPropertyAccessorSymbol(it) } as? KtPropertyGetterSymbol } @@ -104,6 +104,10 @@ internal class KtFirKotlinPropertySymbol( override val isConst: Boolean get() = firRef.withFir { it.isConst } + override val isFromPrimaryConstructor: Boolean + get() = firRef.withFir { + it.fromPrimaryConstructor == true || it.source?.kind == FirFakeSourceElementKind.PropertyFromParameter + } override val isOverride: Boolean get() = firRef.withFir { it.isOverride } override val isStatic: Boolean get() = firRef.withFir { it.isStatic } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt index fee58f90808..61f258d3c22 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt @@ -71,7 +71,6 @@ internal class KtFirSyntheticJavaPropertySymbol( override val callableIdIfNonLocal: CallableId? get() = getCallableIdIfNonLocal() - override val getter: KtPropertyGetterSymbol by firRef.withFirAndCache(FirResolvePhase.RAW_FIR) { property -> property.getter.let { builder.callableBuilder.buildPropertyAccessorSymbol(it) } as KtPropertyGetterSymbol } @@ -83,6 +82,7 @@ internal class KtFirSyntheticJavaPropertySymbol( override val javaGetterName: Name get() = firRef.withFir { it.getter.delegate.name } override val javaSetterName: Name? get() = firRef.withFir { it.setter?.delegate?.name } + override val isFromPrimaryConstructor: Boolean get() = false override val isOverride: Boolean get() = firRef.withFir { it.isOverride } override val isStatic: Boolean get() = firRef.withFir { it.isStatic } diff --git a/idea/idea-frontend-fir/testData/fileScopeTest/simpleFileScope.kt.result b/idea/idea-frontend-fir/testData/fileScopeTest/simpleFileScope.kt.result index 21ba8c9b201..e60d6b8273b 100644 --- a/idea/idea-frontend-fir/testData/fileScopeTest/simpleFileScope.kt.result +++ b/idea/idea-frontend-fir/testData/fileScopeTest/simpleFileScope.kt.result @@ -44,6 +44,7 @@ KtFirKotlinPropertySymbol: initializer: 2 isConst: false isExtension: false + isFromPrimaryConstructor: false isLateInit: false isOverride: false isStatic: false diff --git a/idea/idea-frontend-fir/testData/fileScopeTest/simpleFileScope.txt b/idea/idea-frontend-fir/testData/fileScopeTest/simpleFileScope.txt index 17c5cf553fb..2456bf1370b 100644 --- a/idea/idea-frontend-fir/testData/fileScopeTest/simpleFileScope.txt +++ b/idea/idea-frontend-fir/testData/fileScopeTest/simpleFileScope.txt @@ -45,6 +45,7 @@ KtFirKotlinPropertySymbol: initializer: 2 isConst: false isExtension: false + isFromPrimaryConstructor: false isLateInit: false isOverride: false isStatic: false diff --git a/idea/idea-frontend-fir/testData/memberScopeByFqName/MutableList.txt b/idea/idea-frontend-fir/testData/memberScopeByFqName/MutableList.txt index e69841f33c2..299aa0e43c1 100644 --- a/idea/idea-frontend-fir/testData/memberScopeByFqName/MutableList.txt +++ b/idea/idea-frontend-fir/testData/memberScopeByFqName/MutableList.txt @@ -527,6 +527,7 @@ KtFirKotlinPropertySymbol: initializer: null isConst: false isExtension: false + isFromPrimaryConstructor: false isLateInit: false isOverride: false isStatic: false diff --git a/idea/idea-frontend-fir/testData/memberScopeByFqName/java.lang.String.txt b/idea/idea-frontend-fir/testData/memberScopeByFqName/java.lang.String.txt index f7545245182..7e29c54d9f2 100644 --- a/idea/idea-frontend-fir/testData/memberScopeByFqName/java.lang.String.txt +++ b/idea/idea-frontend-fir/testData/memberScopeByFqName/java.lang.String.txt @@ -73,6 +73,7 @@ KtFirSyntheticJavaPropertySymbol: hasSetter: false initializer: null isExtension: false + isFromPrimaryConstructor: false isOverride: false isStatic: false isVal: true diff --git a/idea/idea-frontend-fir/testData/symbols/symbolByPsi/anonymousObject.txt b/idea/idea-frontend-fir/testData/symbols/symbolByPsi/anonymousObject.txt index b81d80d2c3a..dab06580597 100644 --- a/idea/idea-frontend-fir/testData/symbols/symbolByPsi/anonymousObject.txt +++ b/idea/idea-frontend-fir/testData/symbols/symbolByPsi/anonymousObject.txt @@ -35,6 +35,7 @@ KtFirKotlinPropertySymbol: initializer: 123 isConst: false isExtension: false + isFromPrimaryConstructor: false isLateInit: false isOverride: false isStatic: false @@ -72,6 +73,7 @@ KtFirKotlinPropertySymbol: initializer: KtUnsupportedConstantValue isConst: false isExtension: false + isFromPrimaryConstructor: false isLateInit: false isOverride: false isStatic: false diff --git a/idea/idea-frontend-fir/testData/symbols/symbolByPsi/classMembes.txt b/idea/idea-frontend-fir/testData/symbols/symbolByPsi/classMembes.txt index 9d586cf02b4..1405663d9be 100644 --- a/idea/idea-frontend-fir/testData/symbols/symbolByPsi/classMembes.txt +++ b/idea/idea-frontend-fir/testData/symbols/symbolByPsi/classMembes.txt @@ -11,6 +11,7 @@ KtFirKotlinPropertySymbol: initializer: 10 isConst: false isExtension: false + isFromPrimaryConstructor: false isLateInit: false isOverride: false isStatic: false diff --git a/idea/idea-frontend-fir/testData/symbols/symbolByPsi/enumValueMember.txt b/idea/idea-frontend-fir/testData/symbols/symbolByPsi/enumValueMember.txt index 2de2a8648f9..bdbf70f1d09 100644 --- a/idea/idea-frontend-fir/testData/symbols/symbolByPsi/enumValueMember.txt +++ b/idea/idea-frontend-fir/testData/symbols/symbolByPsi/enumValueMember.txt @@ -60,6 +60,7 @@ KtFirKotlinPropertySymbol: initializer: null isConst: false isExtension: false + isFromPrimaryConstructor: false isLateInit: false isOverride: true isStatic: false @@ -95,6 +96,7 @@ KtFirKotlinPropertySymbol: initializer: null isConst: false isExtension: false + isFromPrimaryConstructor: false isLateInit: false isOverride: false isStatic: false diff --git a/idea/idea-frontend-fir/testData/symbols/symbolByPsi/memberProperties.txt b/idea/idea-frontend-fir/testData/symbols/symbolByPsi/memberProperties.txt index badd9bb0f47..2698436ff8b 100644 --- a/idea/idea-frontend-fir/testData/symbols/symbolByPsi/memberProperties.txt +++ b/idea/idea-frontend-fir/testData/symbols/symbolByPsi/memberProperties.txt @@ -11,6 +11,7 @@ KtFirKotlinPropertySymbol: initializer: 10 isConst: false isExtension: false + isFromPrimaryConstructor: false isLateInit: false isOverride: false isStatic: false @@ -53,6 +54,7 @@ KtFirKotlinPropertySymbol: initializer: null isConst: false isExtension: true + isFromPrimaryConstructor: false isLateInit: false isOverride: false isStatic: false diff --git a/idea/idea-frontend-fir/testData/symbols/symbolByPsi/topLevelProperties.txt b/idea/idea-frontend-fir/testData/symbols/symbolByPsi/topLevelProperties.txt index 8ce571d6dc1..87e53141a56 100644 --- a/idea/idea-frontend-fir/testData/symbols/symbolByPsi/topLevelProperties.txt +++ b/idea/idea-frontend-fir/testData/symbols/symbolByPsi/topLevelProperties.txt @@ -11,6 +11,7 @@ KtFirKotlinPropertySymbol: initializer: 10 isConst: false isExtension: false + isFromPrimaryConstructor: false isLateInit: false isOverride: false isStatic: false @@ -53,6 +54,7 @@ KtFirKotlinPropertySymbol: initializer: null isConst: false isExtension: true + isFromPrimaryConstructor: false isLateInit: false isOverride: false isStatic: false diff --git a/idea/idea-frontend-fir/testData/symbols/symbolByPsi/typeAnnotations.txt b/idea/idea-frontend-fir/testData/symbols/symbolByPsi/typeAnnotations.txt index e1aeb3a875c..7d6481350bc 100644 --- a/idea/idea-frontend-fir/testData/symbols/symbolByPsi/typeAnnotations.txt +++ b/idea/idea-frontend-fir/testData/symbols/symbolByPsi/typeAnnotations.txt @@ -184,6 +184,7 @@ KtFirKotlinPropertySymbol: initializer: KtUnsupportedConstantValue isConst: false isExtension: false + isFromPrimaryConstructor: false isLateInit: false isOverride: false isStatic: false