[FIR] Fix implementation of primaryConstructorSymbol utility

Originally it used list of declarations, which is incorrect, because
  some constructors may be contributed by compiler plugin. And those
  constructors will be contained only in scope
This commit is contained in:
Dmitriy Novozhilov
2023-08-21 12:17:17 +03:00
committed by Space Team
parent 93b0a90172
commit efb96e31fb
4 changed files with 8 additions and 11 deletions
@@ -704,7 +704,7 @@ private fun findDefaultValue(source: KtLightSourceElement): KtLightSourceElement
fun ConeKotlinType.getInlineClassUnderlyingType(session: FirSession): ConeKotlinType { fun ConeKotlinType.getInlineClassUnderlyingType(session: FirSession): ConeKotlinType {
require(this.isSingleFieldValueClass(session)) require(this.isSingleFieldValueClass(session))
return toRegularClassSymbol(session)!!.primaryConstructorSymbol()!!.valueParameterSymbols[0].resolvedReturnTypeRef.coneType return toRegularClassSymbol(session)!!.primaryConstructorSymbol(session)!!.valueParameterSymbols[0].resolvedReturnTypeRef.coneType
} }
fun FirNamedFunctionSymbol.directOverriddenFunctions(session: FirSession, scopeSession: ScopeSession): List<FirNamedFunctionSymbol> { fun FirNamedFunctionSymbol.directOverriddenFunctions(session: FirSession, scopeSession: ScopeSession): List<FirNamedFunctionSymbol> {
@@ -168,7 +168,7 @@ object FirAnnotationClassDeclarationChecker : FirRegularClassChecker() {
} }
private fun checkCyclesInParameters(annotation: FirRegularClassSymbol, context: CheckerContext, reporter: DiagnosticReporter) { private fun checkCyclesInParameters(annotation: FirRegularClassSymbol, context: CheckerContext, reporter: DiagnosticReporter) {
val primaryConstructor = annotation.primaryConstructorSymbol() ?: return val primaryConstructor = annotation.primaryConstructorSymbol(context.session) ?: return
val checker = CycleChecker(annotation, context.session) val checker = CycleChecker(annotation, context.session)
for (valueParameter in primaryConstructor.valueParameterSymbols) { for (valueParameter in primaryConstructor.valueParameterSymbols) {
if (checker.parameterHasCycle(annotation, valueParameter)) { if (checker.parameterHasCycle(annotation, valueParameter)) {
@@ -182,7 +182,7 @@ object FirAnnotationClassDeclarationChecker : FirRegularClassChecker() {
private val annotationsWithCycle = mutableSetOf(targetAnnotation) private val annotationsWithCycle = mutableSetOf(targetAnnotation)
fun annotationHasCycle(annotation: FirRegularClassSymbol): Boolean { fun annotationHasCycle(annotation: FirRegularClassSymbol): Boolean {
val primaryConstructor = annotation.primaryConstructorSymbol() ?: return false val primaryConstructor = annotation.primaryConstructorSymbol(session) ?: return false
for (valueParameter in primaryConstructor.valueParameterSymbols) { for (valueParameter in primaryConstructor.valueParameterSymbols) {
if (parameterHasCycle(annotation, valueParameter)) return true if (parameterHasCycle(annotation, valueParameter)) return true
} }
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.modality
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.fir.types.coneType
@@ -96,13 +97,9 @@ internal val FirBasedSymbol<*>.isLocalMember: Boolean
internal val FirCallableSymbol<*>.isExtensionMember: Boolean internal val FirCallableSymbol<*>.isExtensionMember: Boolean
get() = resolvedReceiverTypeRef != null && dispatchReceiverType != null get() = resolvedReceiverTypeRef != null && dispatchReceiverType != null
fun FirClassSymbol<*>.primaryConstructorSymbol(): FirConstructorSymbol? { @OptIn(SymbolInternals::class)
for (declarationSymbol in this.declarationSymbols) { fun FirClassSymbol<*>.primaryConstructorSymbol(session: FirSession): FirConstructorSymbol? {
if (declarationSymbol is FirConstructorSymbol && declarationSymbol.isPrimary) { return fir.primaryConstructorIfAny(session)
return declarationSymbol
}
}
return null
} }
fun FirTypeRef.needsMultiFieldValueClassFlattening(session: FirSession) = with(session.typeContext) { fun FirTypeRef.needsMultiFieldValueClassFlattening(session: FirSession) = with(session.typeContext) {
@@ -89,7 +89,7 @@ class FirSerializablePropertiesProvider(session: FirSession) : FirExtensionSessi
.let { restoreCorrectOrderFromClassProtoExtension(classSymbol, it) } .let { restoreCorrectOrderFromClassProtoExtension(classSymbol, it) }
val isExternallySerializable = classSymbol.isEnumClass || val isExternallySerializable = classSymbol.isEnumClass ||
primaryConstructorProperties.size == (classSymbol.primaryConstructorSymbol()?.valueParameterSymbols?.size ?: 0) primaryConstructorProperties.size == (classSymbol.primaryConstructorSymbol(session)?.valueParameterSymbols?.size ?: 0)
val (serializableConstructorProperties, serializableStandaloneProperties) = serializableProperties.partition { it.propertySymbol in primaryConstructorProperties } val (serializableConstructorProperties, serializableStandaloneProperties) = serializableProperties.partition { it.propertySymbol in primaryConstructorProperties }
return FirSerializableProperties( return FirSerializableProperties(