FIR LC: populate property from primary ctor later

This commit is contained in:
Jinseong Jeon
2021-08-02 23:55:40 -07:00
committed by Ilya Kirillov
parent fba480875f
commit 46a0c4be4b
14 changed files with 37 additions and 8 deletions
@@ -91,6 +91,7 @@ public sealed class KtPropertySymbol : KtVariableSymbol(),
public abstract val hasBackingField: Boolean public abstract val hasBackingField: Boolean
public abstract val isFromPrimaryConstructor: Boolean
public abstract val isOverride: Boolean public abstract val isOverride: Boolean
public abstract val isStatic: Boolean public abstract val isStatic: Boolean
@@ -142,11 +142,12 @@ internal fun FirLightClassBase.createMethods(
isTopLevel: Boolean = false, isTopLevel: Boolean = false,
suppressStaticForMethods: Boolean = false suppressStaticForMethods: Boolean = false
) { ) {
for (declaration in declarations) { val declarationGroups = declarations.groupBy { it is KtPropertySymbol && it.isFromPrimaryConstructor }
fun handleDeclaration(declaration: KtCallableSymbol) {
when (declaration) { when (declaration) {
is KtFunctionSymbol -> { is KtFunctionSymbol -> {
if (declaration.isInline || declaration.isHiddenOrSynthetic()) continue if (declaration.isInline || declaration.isHiddenOrSynthetic()) return
var methodIndex = METHOD_INDEX_BASE var methodIndex = METHOD_INDEX_BASE
result.add( result.add(
@@ -184,14 +185,14 @@ internal fun FirLightClassBase.createMethods(
} }
is KtPropertySymbol -> { is KtPropertySymbol -> {
if (declaration is KtKotlinPropertySymbol && declaration.isConst) continue if (declaration is KtKotlinPropertySymbol && declaration.isConst) return
if (declaration.visibility.isPrivateOrPrivateToThis() && if (declaration.visibility.isPrivateOrPrivateToThis() &&
declaration.getter?.hasBody == false && declaration.getter?.hasBody == false &&
declaration.setter?.hasBody == false declaration.setter?.hasBody == false
) continue ) return
if (declaration.hasJvmFieldAnnotation()) continue if (declaration.hasJvmFieldAnnotation()) return
fun KtPropertyAccessorSymbol.needToCreateAccessor(siteTarget: AnnotationUseSiteTarget): Boolean { fun KtPropertyAccessorSymbol.needToCreateAccessor(siteTarget: AnnotationUseSiteTarget): Boolean {
if (isInline) return false 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") 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( internal fun FirLightClassBase.createField(
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirFakeSourceElementKind
import org.jetbrains.kotlin.fir.containingClass import org.jetbrains.kotlin.fir.containingClass
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
@@ -89,7 +90,6 @@ internal class KtFirKotlinPropertySymbol(
override val callableIdIfNonLocal: CallableId? get() = getCallableIdIfNonLocal() override val callableIdIfNonLocal: CallableId? get() = getCallableIdIfNonLocal()
override val getter: KtPropertyGetterSymbol? by firRef.withFirAndCache(FirResolvePhase.RAW_FIR) { property -> override val getter: KtPropertyGetterSymbol? by firRef.withFirAndCache(FirResolvePhase.RAW_FIR) { property ->
property.getter?.let { builder.callableBuilder.buildPropertyAccessorSymbol(it) } as? KtPropertyGetterSymbol 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 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 isOverride: Boolean get() = firRef.withFir { it.isOverride }
override val isStatic: Boolean get() = firRef.withFir { it.isStatic } override val isStatic: Boolean get() = firRef.withFir { it.isStatic }
@@ -71,7 +71,6 @@ internal class KtFirSyntheticJavaPropertySymbol(
override val callableIdIfNonLocal: CallableId? get() = getCallableIdIfNonLocal() override val callableIdIfNonLocal: CallableId? get() = getCallableIdIfNonLocal()
override val getter: KtPropertyGetterSymbol by firRef.withFirAndCache(FirResolvePhase.RAW_FIR) { property -> override val getter: KtPropertyGetterSymbol by firRef.withFirAndCache(FirResolvePhase.RAW_FIR) { property ->
property.getter.let { builder.callableBuilder.buildPropertyAccessorSymbol(it) } as KtPropertyGetterSymbol 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 javaGetterName: Name get() = firRef.withFir { it.getter.delegate.name }
override val javaSetterName: Name? get() = firRef.withFir { it.setter?.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 isOverride: Boolean get() = firRef.withFir { it.isOverride }
override val isStatic: Boolean get() = firRef.withFir { it.isStatic } override val isStatic: Boolean get() = firRef.withFir { it.isStatic }
@@ -44,6 +44,7 @@ KtFirKotlinPropertySymbol:
initializer: 2 initializer: 2
isConst: false isConst: false
isExtension: false isExtension: false
isFromPrimaryConstructor: false
isLateInit: false isLateInit: false
isOverride: false isOverride: false
isStatic: false isStatic: false
@@ -45,6 +45,7 @@ KtFirKotlinPropertySymbol:
initializer: 2 initializer: 2
isConst: false isConst: false
isExtension: false isExtension: false
isFromPrimaryConstructor: false
isLateInit: false isLateInit: false
isOverride: false isOverride: false
isStatic: false isStatic: false
@@ -527,6 +527,7 @@ KtFirKotlinPropertySymbol:
initializer: null initializer: null
isConst: false isConst: false
isExtension: false isExtension: false
isFromPrimaryConstructor: false
isLateInit: false isLateInit: false
isOverride: false isOverride: false
isStatic: false isStatic: false
@@ -73,6 +73,7 @@ KtFirSyntheticJavaPropertySymbol:
hasSetter: false hasSetter: false
initializer: null initializer: null
isExtension: false isExtension: false
isFromPrimaryConstructor: false
isOverride: false isOverride: false
isStatic: false isStatic: false
isVal: true isVal: true
@@ -35,6 +35,7 @@ KtFirKotlinPropertySymbol:
initializer: 123 initializer: 123
isConst: false isConst: false
isExtension: false isExtension: false
isFromPrimaryConstructor: false
isLateInit: false isLateInit: false
isOverride: false isOverride: false
isStatic: false isStatic: false
@@ -72,6 +73,7 @@ KtFirKotlinPropertySymbol:
initializer: KtUnsupportedConstantValue initializer: KtUnsupportedConstantValue
isConst: false isConst: false
isExtension: false isExtension: false
isFromPrimaryConstructor: false
isLateInit: false isLateInit: false
isOverride: false isOverride: false
isStatic: false isStatic: false
@@ -11,6 +11,7 @@ KtFirKotlinPropertySymbol:
initializer: 10 initializer: 10
isConst: false isConst: false
isExtension: false isExtension: false
isFromPrimaryConstructor: false
isLateInit: false isLateInit: false
isOverride: false isOverride: false
isStatic: false isStatic: false
@@ -60,6 +60,7 @@ KtFirKotlinPropertySymbol:
initializer: null initializer: null
isConst: false isConst: false
isExtension: false isExtension: false
isFromPrimaryConstructor: false
isLateInit: false isLateInit: false
isOverride: true isOverride: true
isStatic: false isStatic: false
@@ -95,6 +96,7 @@ KtFirKotlinPropertySymbol:
initializer: null initializer: null
isConst: false isConst: false
isExtension: false isExtension: false
isFromPrimaryConstructor: false
isLateInit: false isLateInit: false
isOverride: false isOverride: false
isStatic: false isStatic: false
@@ -11,6 +11,7 @@ KtFirKotlinPropertySymbol:
initializer: 10 initializer: 10
isConst: false isConst: false
isExtension: false isExtension: false
isFromPrimaryConstructor: false
isLateInit: false isLateInit: false
isOverride: false isOverride: false
isStatic: false isStatic: false
@@ -53,6 +54,7 @@ KtFirKotlinPropertySymbol:
initializer: null initializer: null
isConst: false isConst: false
isExtension: true isExtension: true
isFromPrimaryConstructor: false
isLateInit: false isLateInit: false
isOverride: false isOverride: false
isStatic: false isStatic: false
@@ -11,6 +11,7 @@ KtFirKotlinPropertySymbol:
initializer: 10 initializer: 10
isConst: false isConst: false
isExtension: false isExtension: false
isFromPrimaryConstructor: false
isLateInit: false isLateInit: false
isOverride: false isOverride: false
isStatic: false isStatic: false
@@ -53,6 +54,7 @@ KtFirKotlinPropertySymbol:
initializer: null initializer: null
isConst: false isConst: false
isExtension: true isExtension: true
isFromPrimaryConstructor: false
isLateInit: false isLateInit: false
isOverride: false isOverride: false
isStatic: false isStatic: false
@@ -184,6 +184,7 @@ KtFirKotlinPropertySymbol:
initializer: KtUnsupportedConstantValue initializer: KtUnsupportedConstantValue
isConst: false isConst: false
isExtension: false isExtension: false
isFromPrimaryConstructor: false
isLateInit: false isLateInit: false
isOverride: false isOverride: false
isStatic: false isStatic: false