diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt index e56d444a223..7c70973ee92 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt @@ -7,11 +7,12 @@ package org.jetbrains.kotlin.fir.analysis.checkers import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Modality -import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.FirSymbolOwner import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibility +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.FirSymbolOwner import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.containingClass import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression @@ -23,7 +24,6 @@ import org.jetbrains.kotlin.fir.resolve.transformers.firClassLike import org.jetbrains.kotlin.fir.scopes.ProcessorAction import org.jetbrains.kotlin.fir.scopes.processOverriddenFunctions import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope -import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.fir.types.ConeClassLikeType @@ -142,18 +142,8 @@ inline fun FirQualifiedAccessExpression.getDeclaration(): T? { * Returns the ClassLikeDeclaration where the Fir object has been defined * or null if no proper declaration has been found. */ -fun FirSymbolOwner<*>.getContainingClass(context: CheckerContext): FirClassLikeDeclaration<*>? { - val classId = this.symbol.safeAs>() - ?.callableId - ?.classId - ?: return null - - if (!classId.isLocal) { - return context.session.firSymbolProvider.getClassLikeSymbolByFqName(classId)?.fir - } - - return null -} +fun FirSymbolOwner<*>.getContainingClass(context: CheckerContext): FirClassLikeDeclaration<*>? = + this.safeAs>()?.containingClass()?.toSymbol(context.session)?.fir /** * Returns the FirClassLikeDeclaration the type alias is pointing diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirSuperclassNotAccessibleFromInterfaceChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirSuperclassNotAccessibleFromInterfaceChecker.kt index 19644efb0c1..5cbdc7c00a5 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirSuperclassNotAccessibleFromInterfaceChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirSuperclassNotAccessibleFromInterfaceChecker.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.analysis.checkers.expression import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClass import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration @@ -15,8 +16,6 @@ import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.references.FirSuperReference -import org.jetbrains.kotlin.fir.resolve.firSymbolProvider -import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.utils.addToStdlib.safeAs @@ -45,17 +44,7 @@ object FirSuperclassNotAccessibleFromInterfaceChecker : FirQualifiedAccessChecke * or null if no proper declaration has been found. */ private fun getClassLikeDeclaration(functionCall: FirQualifiedAccessExpression, context: CheckerContext): FirClassLikeDeclaration<*>? { - val classId = functionCall.calleeReference.safeAs() - ?.resolvedSymbol.safeAs() - ?.callableId - ?.classId - ?: return null - - if (!classId.isLocal) { - return context.session.firSymbolProvider.getClassLikeSymbolByFqName(classId)?.fir - } - - return null + return functionCall.calleeReference.safeAs()?.resolvedSymbol?.fir?.getContainingClass(context) } private fun DiagnosticReporter.report(source: FirSourceElement?) { @@ -63,4 +52,4 @@ object FirSuperclassNotAccessibleFromInterfaceChecker : FirQualifiedAccessChecke report(FirErrors.SUPERCLASS_NOT_ACCESSIBLE_FROM_INTERFACE.on(it)) } } -} \ No newline at end of file +} diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/CanBeReplacedWithOperatorAssignmentChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/CanBeReplacedWithOperatorAssignmentChecker.kt index bb344b7ceb0..0f28f5e2d70 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/CanBeReplacedWithOperatorAssignmentChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/CanBeReplacedWithOperatorAssignmentChecker.kt @@ -9,9 +9,7 @@ import com.intellij.lang.LighterASTNode import com.intellij.openapi.util.Ref import com.intellij.psi.tree.IElementType import org.jetbrains.kotlin.KtNodeTypes -import org.jetbrains.kotlin.fir.FirFakeSourceElementKind -import org.jetbrains.kotlin.fir.FirLightSourceElement -import org.jetbrains.kotlin.fir.FirPsiSourceElement +import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirExpressionChecker import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter @@ -20,7 +18,6 @@ import org.jetbrains.kotlin.fir.analysis.getChild import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment import org.jetbrains.kotlin.fir.expressions.toResolvedCallableSymbol -import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.symbols.StandardClassIds import org.jetbrains.kotlin.fir.types.classId @@ -41,7 +38,7 @@ object CanBeReplacedWithOperatorAssignmentChecker : FirExpressionChecker)?.getContainingClass(checkerContext) != null) return + if ((graph.declaration as? FirSymbolOwner<*>)?.getContainingClass(checkerContext)?.takeIf { !it.symbol.classId.isLocal }!= null) return val properties = LocalPropertyCollector.collect(graph) if (properties.isEmpty()) return @@ -203,4 +203,4 @@ object UnusedChecker : FirControlFlowChecker() { private val FirPropertySymbol.identifierSource: FirSourceElement? get() = fir.source?.getChild(KtTokens.IDENTIFIER, 0, 1) -} \ No newline at end of file +} diff --git a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmMangleComputer.kt b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmMangleComputer.kt index 8e3bdf6c496..c9e9caeafe5 100644 --- a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmMangleComputer.kt +++ b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmMangleComputer.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.backend.common.serialization.mangle.MangleMode import org.jetbrains.kotlin.backend.common.serialization.mangle.collectForMangler import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.containingClass import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.resolve.firSymbolProvider @@ -75,7 +76,7 @@ open class FirJvmMangleComputer( private fun FirDeclaration.visitParent() { val (parentPackageFqName, parentClassId) = when (this) { - is FirCallableDeclaration<*> -> this.symbol.callableId.let { it.packageName to it.classId } + is FirCallableMemberDeclaration<*> -> this.containingClass()?.classId?.let { it.packageFqName to it } ?: return is FirClassLikeDeclaration<*> -> this.symbol.classId.let { it.packageFqName to it.outerClassId } else -> return } diff --git a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmSerializerExtension.kt b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmSerializerExtension.kt index b5fb0c58d17..af4b627c07a 100644 --- a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmSerializerExtension.kt +++ b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmSerializerExtension.kt @@ -10,8 +10,8 @@ import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.config.JvmDefaultMode import org.jetbrains.kotlin.descriptors.ClassKind -import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.descriptors.Visibilities +import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.backend.FirMetadataSource import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.resolve.firProvider @@ -279,7 +279,7 @@ class FirJvmSerializerExtension( if (!hasJvmFieldAnnotation) return false val container = - symbol.callableId.classId?.let { + dispatchReceiverType?.classId?.let { session.firProvider.getFirClassifierByFqName(it) as? FirRegularClass } if (container == null || !container.isCompanion) { diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt index 0a61b28bdcd..3960f0d2dc4 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.calls.SyntheticPropertySymbol import org.jetbrains.kotlin.fir.resolve.providers.FirProvider import org.jetbrains.kotlin.fir.scopes.ProcessorAction +import org.jetbrains.kotlin.fir.scopes.impl.delegatedWrapperData import org.jetbrains.kotlin.fir.scopes.processDirectlyOverriddenFunctions import org.jetbrains.kotlin.fir.scopes.processDirectlyOverriddenProperties import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope @@ -218,7 +219,9 @@ internal tailrec fun FirCallableSymbol<*>.deepestOverriddenSymbol(): FirCallable internal tailrec fun FirCallableSymbol<*>.deepestMatchingOverriddenSymbol(root: FirCallableSymbol<*> = this): FirCallableSymbol<*> { if (isIntersectionOverride) return this - val overriddenSymbol = overriddenSymbol?.takeIf { it.callableId == root.callableId } ?: return this + val overriddenSymbol = overriddenSymbol?.takeIf { + it.containingClass() == root.containingClass() + } ?: return this return overriddenSymbol.deepestMatchingOverriddenSymbol(this) } @@ -235,7 +238,11 @@ internal fun FirSimpleFunction.generateOverriddenFunctionSymbols( if ((it.fir as FirSimpleFunction).visibility == Visibilities.Private) { return@processDirectlyOverriddenFunctions ProcessorAction.NEXT } - val overridden = declarationStorage.getIrFunctionSymbol(it.unwrapSubstitutionOverrides()) + + val unwrapped = + it.fir.delegatedWrapperData?.takeIf { it.containingClass == containingClass.symbol.toLookupTag() }?.wrapped?.symbol ?: it + + val overridden = declarationStorage.getIrFunctionSymbol(unwrapped.unwrapSubstitutionOverrides()) overriddenSet += overridden as IrSimpleFunctionSymbol ProcessorAction.NEXT } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt index a07f39fc0d9..0ad64004aa7 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt @@ -8,7 +8,7 @@ package org.jetbrains.kotlin.fir.backend import org.jetbrains.kotlin.KtNodeTypes import org.jetbrains.kotlin.builtins.StandardNames.BUILT_INS_PACKAGE_FQ_NAMES import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.fir.FirAnnotationContainer +import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.backend.generators.AnnotationGenerator import org.jetbrains.kotlin.fir.backend.generators.DelegatedMemberGenerator import org.jetbrains.kotlin.fir.declarations.* @@ -25,7 +25,6 @@ import org.jetbrains.kotlin.fir.lazy.Fir2IrLazyClass import org.jetbrains.kotlin.fir.lazy.Fir2IrLazyConstructor import org.jetbrains.kotlin.fir.lazy.Fir2IrLazyProperty import org.jetbrains.kotlin.fir.lazy.Fir2IrLazySimpleFunction -import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.resolve.firProvider import org.jetbrains.kotlin.fir.resolve.firSymbolProvider import org.jetbrains.kotlin.fir.resolve.inference.isSuspendFunctionType @@ -236,7 +235,7 @@ class Fir2IrDeclarationStorage( internal fun findIrParent(callableDeclaration: FirCallableDeclaration<*>): IrDeclarationParent? { val firBasedSymbol = callableDeclaration.symbol val callableId = firBasedSymbol.callableId - return findIrParent(callableId.packageName, callableId.classId, firBasedSymbol) + return findIrParent(callableId.packageName, callableDeclaration.containingClass()?.classId, firBasedSymbol) } private fun IrDeclaration.setAndModifyParent(irParent: IrDeclarationParent?) { @@ -977,7 +976,8 @@ class Fir2IrDeclarationStorage( val firConstructor = firConstructorSymbol.fir getCachedIrConstructor(firConstructor)?.let { return it.symbol } val signature = signatureComposer.composeSignature(firConstructor) - val irParent = findIrParent(firConstructor) as IrClass + val irParent = findIrParent(firConstructor) as? IrClass + ?: error("sadsad") val parentOrigin = irParent.origin if (signature != null) { symbolTable.referenceConstructorIfAny(signature)?.let { irConstructorSymbol -> @@ -1100,7 +1100,7 @@ class Fir2IrDeclarationStorage( symbolTable.declareProperty(signature, { symbol }) { val isFakeOverride = firPropertySymbol.isFakeOverride && - firPropertySymbol.callableId != firPropertySymbol.overriddenSymbol?.callableId + firPropertySymbol.dispatchReceiverClassOrNull() != firPropertySymbol.overriddenSymbol?.dispatchReceiverClassOrNull() Fir2IrLazyProperty( components, startOffset, endOffset, declarationOrigin, fir, irParent.fir, symbol, isFakeOverride ).apply { @@ -1154,7 +1154,7 @@ class Fir2IrDeclarationStorage( is FirEnumEntry -> { classifierStorage.getCachedIrEnumEntry(firDeclaration)?.let { return it.symbol } val containingFile = firProvider.getFirCallableContainerFile(firVariableSymbol) - val irParentClass = firVariableSymbol.callableId.classId?.let { findIrClass(it) } + val irParentClass = firDeclaration.containingClass()?.classId?.let { findIrClass(it) } classifierStorage.createIrEnumEntry( firDeclaration, irParent = irParentClass, diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt index 73f63c70351..95e1f9f9970 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.backend.generators import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.fir.backend.* import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.dispatchReceiverClassOrNull import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression import org.jetbrains.kotlin.fir.psi @@ -401,9 +402,9 @@ class CallAndReferenceGenerator( return null } val resolvedReference = callableReferenceAccess.calleeReference as FirResolvedNamedReference - val callableId = (resolvedReference.resolvedSymbol as FirCallableSymbol<*>).callableId + val firCallableSymbol = resolvedReference.resolvedSymbol as FirCallableSymbol<*> // Make sure the reference indeed refers to a member of that companion - if (callableId.classId != classSymbol.classId) { + if (firCallableSymbol.dispatchReceiverClassOrNull() != classSymbol.toLookupTag()) { return null } } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt index 915e7249a8f..d3a5aa1d379 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.backend.* import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertySetter +import org.jetbrains.kotlin.fir.dispatchReceiverClassOrNull import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression @@ -124,7 +125,7 @@ internal class ClassMemberGenerator( irFunction.body = IrSyntheticBodyImpl(startOffset, endOffset, kind) } irFunction.parent is IrClass && irFunction.parentAsClass.isData -> { - val classId = firFunction?.symbol?.callableId?.classId + val classId = firFunction?.symbol?.dispatchReceiverClassOrNull()?.classId when { DataClassMembersGenerator.isComponentN(irFunction) -> firFunction?.body?.let { irFunction.body = visitor.convertToIrBlockBody(it) } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt index bcae521cba9..dc0bb655b8d 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.fir.symbols.PossiblyFirFakeOverrideSymbol import org.jetbrains.kotlin.fir.symbols.StandardClassIds import org.jetbrains.kotlin.fir.symbols.impl.* +import org.jetbrains.kotlin.fir.types.ConeClassLikeType import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrBlockBody import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl @@ -84,7 +85,7 @@ internal class DelegatedMemberGenerator( } } - private inline fun > S.unwrapDelegateTarget( + private inline fun > S.unwrapDelegateTarget( subClassLookupTag: ConeClassLikeLookupTag, noinline directOverridden: S.() -> List, firField: FirField, @@ -103,7 +104,8 @@ internal class DelegatedMemberGenerator( val wrappedSymbol = wrapped.symbol as? S ?: return null return when { - wrappedSymbol.isFakeOverride && wrappedSymbol.callableId.classId == firSubClass.classId -> + wrappedSymbol.isFakeOverride && + (wrappedSymbol.fir.dispatchReceiverType as? ConeClassLikeType)?.lookupTag == firSubClass.symbol.toLookupTag() -> wrapped.symbol.overriddenSymbol!!.fir else -> wrapped } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt index 4c8b81fadaf..e40a2f1598d 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt @@ -149,16 +149,16 @@ class FakeOverrideGenerator( scope: FirTypeScope, ) where S : FirCallableSymbol, S : PossiblyFirFakeOverrideSymbol { if (originalSymbol !is S || originalSymbol in realDeclarationSymbols) return - val classId = klass.symbol.classId + val classLookupTag = klass.symbol.toLookupTag() val originalDeclaration = originalSymbol.fir - if (originalSymbol.callableId.classId == classId && !originalDeclaration.origin.fromSupertypes) return + if (originalSymbol.dispatchReceiverClassOrNull() == classLookupTag && !originalDeclaration.origin.fromSupertypes) return if (originalDeclaration.visibility == Visibilities.Private) return val origin = IrDeclarationOrigin.FAKE_OVERRIDE val baseSymbol = originalSymbol.deepestOverriddenSymbol() as S if ((originalSymbol.isFakeOverride || originalSymbol.isIntersectionOverride) && - originalSymbol.callableId.classId == classId + originalSymbol.dispatchReceiverClassOrNull() == classLookupTag ) { // Substitution case // NB: see comment above about substituted function' parent @@ -170,7 +170,7 @@ class FakeOverrideGenerator( isLocal ) irDeclaration.parent = irClass - baseSymbols[irDeclaration] = computeBaseSymbols(originalSymbol, baseSymbol, computeDirectOverridden, scope, classId) + baseSymbols[irDeclaration] = computeBaseSymbols(originalSymbol, baseSymbol, computeDirectOverridden, scope, classLookupTag) result += irDeclaration } else if (originalDeclaration.allowsToHaveFakeOverrideIn(klass)) { // Trivial fake override case @@ -189,7 +189,7 @@ class FakeOverrideGenerator( return } irDeclaration.parent = irClass - baseSymbols[irDeclaration] = computeBaseSymbols(originalSymbol, baseSymbol, computeDirectOverridden, scope, classId) + baseSymbols[irDeclaration] = computeBaseSymbols(originalSymbol, baseSymbol, computeDirectOverridden, scope, classLookupTag) result += irDeclaration } } @@ -199,12 +199,12 @@ class FakeOverrideGenerator( basedSymbol: S, directOverridden: FirTypeScope.(S) -> List, scope: FirTypeScope, - containingClassId: ClassId, + containingClass: ConeClassLikeLookupTag, ): List { if (!symbol.isIntersectionOverride) return listOf(basedSymbol) return scope.directOverridden(symbol).map { @Suppress("UNCHECKED_CAST") - if (it is PossiblyFirFakeOverrideSymbol<*, *> && it.isFakeOverride && it.callableId.classId == containingClassId) + if (it is PossiblyFirFakeOverrideSymbol<*, *> && it.isFakeOverride && it.dispatchReceiverClassOrNull() == containingClass) it.overriddenSymbol!! as S else it diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt index ce10f5017a9..b7a1418ffd5 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt @@ -5,14 +5,12 @@ package org.jetbrains.kotlin.fir.lazy -import org.jetbrains.kotlin.descriptors.ClassDescriptor -import org.jetbrains.kotlin.descriptors.ClassKind -import org.jetbrains.kotlin.descriptors.Modality -import org.jetbrains.kotlin.descriptors.SourceElement +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.fir.backend.Fir2IrComponents import org.jetbrains.kotlin.fir.backend.declareThisReceiverParameter import org.jetbrains.kotlin.fir.backend.toIrType import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.dispatchReceiverClassOrNull import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope import org.jetbrains.kotlin.fir.symbols.Fir2IrClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol @@ -26,7 +24,6 @@ import org.jetbrains.kotlin.ir.expressions.IrConstructorCall import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.descriptors.DescriptorVisibility class Fir2IrLazyClass( components: Fir2IrComponents, @@ -140,7 +137,7 @@ class Fir2IrLazyClass( result += declarationStorage.getIrFunctionSymbol(declaration.symbol).owner } else { scope.processFunctionsByName(declaration.name) { - if (it is FirNamedFunctionSymbol && it.callableId.classId == fir.symbol.classId) { + if (it is FirNamedFunctionSymbol && it.dispatchReceiverClassOrNull() == fir.symbol.toLookupTag()) { if (it.isAbstractMethodOfAny()) { return@processFunctionsByName } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt index 10fb4f5abb9..31bce5491f1 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt @@ -6,16 +6,12 @@ package org.jetbrains.kotlin.fir.signaturer import org.jetbrains.kotlin.descriptors.Visibilities -import org.jetbrains.kotlin.fir.FirElement -import org.jetbrains.kotlin.fir.NoMutableState +import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.backend.Fir2IrSignatureComposer import org.jetbrains.kotlin.fir.declarations.* -import org.jetbrains.kotlin.fir.render -import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid import org.jetbrains.kotlin.ir.util.IdSignature -import org.jetbrains.kotlin.name.FqName @NoMutableState class FirBasedSignatureComposer(private val mangler: FirMangler) : Fir2IrSignatureComposer { @@ -60,14 +56,12 @@ class FirBasedSignatureComposer(private val mangler: FirMangler) : Fir2IrSignatu } } - private val CallableId.relativeCallableName: FqName - get() = className?.child(callableName) ?: FqName.topLevel(callableName) - override fun composeSignature(declaration: FirDeclaration, containingClass: ConeClassLikeLookupTag?): IdSignature? { if (declaration is FirAnonymousObject || declaration is FirAnonymousFunction) return null if (declaration is FirRegularClass && declaration.classId.isLocal) return null if (declaration is FirCallableMemberDeclaration<*>) { - if (declaration.visibility == Visibilities.Local || declaration.symbol.callableId.classId?.isLocal == true || containingClass?.classId?.isLocal == true) return null + if (declaration.visibility == Visibilities.Local) return null + if (declaration.symbol.dispatchReceiverClassOrNull()?.classId?.isLocal == true || containingClass?.classId?.isLocal == true) return null } val builder = SignatureBuilder() try { @@ -93,11 +87,15 @@ class FirBasedSignatureComposer(private val mangler: FirMangler) : Fir2IrSignatu is FirCallableMemberDeclaration<*> -> { if (declaration.visibility == Visibilities.Private) return null val containingClassId = containingClass?.classId - val baseCallableId = declaration.symbol.callableId - val callableId = - if (containingClassId != null) CallableId(containingClassId, baseCallableId.callableName) else baseCallableId + + val classId = containingClassId ?: declaration.containingClass()?.classId + val packageName = classId?.packageFqName ?: declaration.symbol.callableId.packageName + val callableName = declaration.symbol.callableId.callableName + IdSignature.PublicSignature( - callableId.packageName.asString(), callableId.relativeCallableName.asString(), builder.hashId, builder.mask + packageName.asString(), + classId?.relativeClassName?.child(callableName)?.asString() ?: callableName.asString(), + builder.hashId, builder.mask ) } else -> error("Unsupported FIR declaration in signature composer: ${declaration.render()}") diff --git a/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/ConeEquivalentCallConflictResolver.kt b/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/ConeEquivalentCallConflictResolver.kt index f5e0481e6fa..d2157e910ad 100644 --- a/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/ConeEquivalentCallConflictResolver.kt +++ b/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/ConeEquivalentCallConflictResolver.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.resolve.calls.jvm +import org.jetbrains.kotlin.fir.containingClass import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.resolve.calls.AbstractConeCallConflictResolver import org.jetbrains.kotlin.fir.resolve.calls.Candidate @@ -31,10 +32,10 @@ class ConeEquivalentCallConflictResolver( val result = mutableSetOf() outerLoop@ for (myCandidate in candidates) { val me = myCandidate.symbol.fir - if (me is FirCallableMemberDeclaration<*> && me.symbol.callableId.className == null) { + if (me is FirCallableMemberDeclaration<*> && me.symbol.containingClass() == null) { for (otherCandidate in result) { val other = otherCandidate.symbol.fir - if (other is FirCallableMemberDeclaration<*> && other.symbol.callableId.className == null) { + if (other is FirCallableMemberDeclaration<*> && other.symbol.containingClass() == null) { if (areEquivalentTopLevelCallables(me, myCandidate, other, otherCandidate)) { continue@outerLoop } @@ -71,4 +72,4 @@ class ConeEquivalentCallConflictResolver( else -> error("Not supported: $declaration") } } -} \ No newline at end of file +} diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirEffectiveVisibilityResolverImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirEffectiveVisibilityResolverImpl.kt index 7509a66433e..e9a30612e26 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirEffectiveVisibilityResolverImpl.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirEffectiveVisibilityResolverImpl.kt @@ -117,13 +117,13 @@ open class FirEffectiveVisibilityResolverImpl(private val session: FirSession) : } private fun FirDeclaration.getParentClassId(): ClassId? = when (this) { - is FirCallableMemberDeclaration<*> -> this.symbol.callableId.classId + is FirCallableMemberDeclaration<*> -> this.containingClass()?.classId is FirClassLikeDeclaration<*> -> this.symbol.classId.outerClassId else -> null } private fun FirDeclaration.getClassId(): ClassId? = when (this) { - is FirCallableMemberDeclaration<*> -> this.symbol.callableId.classId + is FirCallableMemberDeclaration<*> -> this.containingClass()?.classId is FirClassLikeDeclaration<*> -> this.symbol.classId else -> null } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt index 83a199e2707..a595faf950e 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.resolve.firSymbolProvider import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.resolve.lookupSuperTypes import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol +import org.jetbrains.kotlin.fir.symbols.PossiblyFirFakeOverrideSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol @@ -38,11 +39,17 @@ abstract class FirVisibilityChecker : FirSessionComponent { } } - fun isVisible( - declaration: FirMemberDeclaration, - symbol: AbstractFirBasedSymbol<*>, + fun isVisible( + declaration: T, candidate: Candidate - ): Boolean { + ): Boolean where T : FirMemberDeclaration, T : FirSymbolOwner<*> { + val symbol = declaration.symbol + + if (symbol is PossiblyFirFakeOverrideSymbol<*, *> && symbol.overriddenSymbol != null) { + @Suppress("UNCHECKED_CAST") + return isVisible(symbol.overriddenSymbol!!.fir as T, candidate) + } + val callInfo = candidate.callInfo val useSiteFile = callInfo.containingFile val containingDeclarations = callInfo.containingDeclarations @@ -174,7 +181,7 @@ abstract class FirVisibilityChecker : FirSessionComponent { ownerId } } - is FirCallableSymbol<*> -> callableId.classId + is FirCallableSymbol<*> -> containingClass()?.classId else -> error("Unsupported owner search for ${fir.javaClass}: ${fir.render()}") } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt index c184071e083..905b6f04f7c 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt @@ -14,7 +14,6 @@ import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier import org.jetbrains.kotlin.fir.references.FirSuperReference import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.inference.* -import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.symbols.SyntheticSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol @@ -226,33 +225,31 @@ internal object CheckVisibility : CheckerStage() { val symbol = candidate.symbol val declaration = symbol.fir if (declaration is FirMemberDeclaration) { - if (!checkVisibility(declaration, symbol, sink, candidate, visibilityChecker)) { + if (!checkVisibility(declaration, sink, candidate, visibilityChecker)) { return } } if (declaration is FirConstructor) { - val ownerClassId = declaration.symbol.callableId.classId!! - val provider = declaration.session.firSymbolProvider - val classSymbol = provider.getClassLikeSymbolByFqName(ownerClassId) + // TODO: Should be some other form + val classSymbol = declaration.returnTypeRef.coneTypeUnsafe().lookupTag.toSymbol(declaration.session) if (classSymbol is FirRegularClassSymbol) { if (classSymbol.fir.classKind.isSingleton) { sink.yieldDiagnostic(HiddenCandidate) } - checkVisibility(classSymbol.fir, classSymbol, sink, candidate, visibilityChecker) + checkVisibility(classSymbol.fir, sink, candidate, visibilityChecker) } } } - private suspend fun checkVisibility( - declaration: FirMemberDeclaration, - symbol: AbstractFirBasedSymbol<*>, + private suspend fun checkVisibility( + declaration: T, sink: CheckerSink, candidate: Candidate, visibilityChecker: FirVisibilityChecker - ): Boolean { - if (!visibilityChecker.isVisible(declaration, symbol, candidate)) { + ): Boolean where T : FirMemberDeclaration, T : FirSymbolOwner<*> { + if (!visibilityChecker.isVisible(declaration, candidate)) { sink.yieldDiagnostic(HiddenCandidate) return false } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/SuperCalls.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/SuperCalls.kt index fd3eef45bf6..3630cc0ef40 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/SuperCalls.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/SuperCalls.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.declarations.modality +import org.jetbrains.kotlin.fir.dispatchReceiverClassOrNull import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess import org.jetbrains.kotlin.fir.references.FirNamedReference @@ -146,5 +147,5 @@ private fun BodyResolveComponents.isConcreteMember(supertype: ConeKotlinType, me val classSymbol = (supertype as? ConeClassLikeType)?.lookupTag?.toSymbol(session) as? FirRegularClassSymbol ?: return true if (classSymbol.fir.classKind != ClassKind.INTERFACE) return true - return member.symbol.unwrapSubstitutionOverrides().callableId.classId != StandardClassIds.Any + return member.symbol.unwrapSubstitutionOverrides().dispatchReceiverClassOrNull()?.classId != StandardClassIds.Any } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Synthetics.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Synthetics.kt index 6c365b65288..ff7a2ab09fd 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Synthetics.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Synthetics.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.declarations.isStatic import org.jetbrains.kotlin.fir.declarations.synthetic.buildSyntheticProperty +import org.jetbrains.kotlin.fir.dispatchReceiverClassOrNull import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirTypeScope import org.jetbrains.kotlin.fir.scopes.ProcessorAction @@ -74,7 +75,7 @@ class FirSyntheticPropertiesScope( val parameter = setter.valueParameters.singleOrNull() ?: return if (setter.typeParameters.isNotEmpty() || setter.isStatic) return val parameterType = (parameter.returnTypeRef as? FirResolvedTypeRef)?.type ?: return - if (getter.symbol.callableId.classId == setter.symbol.callableId.classId) { + if (getter.symbol.dispatchReceiverClassOrNull() == setter.symbol.dispatchReceiverClassOrNull()) { if (getterReturnType.withNullability(NOT_NULL) != parameterType.withNullability(NOT_NULL)) { return } @@ -102,12 +103,16 @@ class FirSyntheticPropertiesScope( } } + val classLookupTag = getterSymbol.dispatchReceiverClassOrNull() + val packageName = classLookupTag?.classId?.packageFqName ?: getterSymbol.callableId.packageName + val className = classLookupTag?.classId?.relativeClassName + val property = buildSyntheticProperty { session = this@FirSyntheticPropertiesScope.session name = propertyName symbol = SyntheticPropertySymbol( accessorId = getterSymbol.callableId, - callableId = CallableId(getterSymbol.callableId.packageName, getterSymbol.callableId.className, propertyName) + callableId = CallableId(packageName, className, propertyName) ) delegateGetter = getter delegateSetter = matchingSetter diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevels.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevels.kt index ae5996dfd79..e825ea6c706 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevels.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevels.kt @@ -9,22 +9,21 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirConstructor import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.isInner +import org.jetbrains.kotlin.fir.dispatchReceiverClassOrNull import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.builder.buildResolvedQualifier -import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents -import org.jetbrains.kotlin.fir.resolve.ScopeSession +import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.calls.* -import org.jetbrains.kotlin.fir.resolve.firSymbolProvider import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.resultType -import org.jetbrains.kotlin.fir.resolve.typeForQualifier import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.ProcessorAction +import org.jetbrains.kotlin.fir.scopes.impl.importedFromObjectClassId import org.jetbrains.kotlin.fir.scopes.processClassifiersByName import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.* +import org.jetbrains.kotlin.fir.types.ConeClassLikeType import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeNullability -import org.jetbrains.kotlin.fir.types.classId import org.jetbrains.kotlin.fir.types.withNullability import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.util.OperatorNameConventions @@ -190,13 +189,13 @@ class ScopeTowerLevel( } private fun dispatchReceiverValue(candidate: FirCallableSymbol<*>): ReceiverValue? { - val holderId = candidate.callableId.classId - if (holderId != null && candidate.fir.origin == FirDeclarationOrigin.ImportedFromObject) { - val symbol = session.firSymbolProvider.getClassLikeSymbolByFqName(holderId) + val lookupTag = candidate.dispatchReceiverClassOrNull() + candidate.fir.importedFromObjectClassId?.let { objectClassId -> + val symbol = session.firSymbolProvider.getClassLikeSymbolByFqName(objectClassId) if (symbol is FirRegularClassSymbol) { val resolvedQualifier = buildResolvedQualifier { - packageFqName = holderId.packageFqName - relativeClassFqName = holderId.relativeClassName + packageFqName = objectClassId.packageFqName + relativeClassFqName = objectClassId.relativeClassName this.symbol = symbol }.apply { resultType = bodyResolveComponents.typeForQualifier(this) @@ -206,9 +205,9 @@ class ScopeTowerLevel( } return when { candidate !is FirBackingFieldSymbol -> null - candidate.callableId.classId != null -> { + lookupTag != null -> { bodyResolveComponents.implicitReceiverStack.lastDispatchReceiver { implicitReceiverValue -> - implicitReceiverValue.type.classId == holderId + (implicitReceiverValue.type as? ConeClassLikeType)?.fullyExpandedType(session)?.lookupTag == lookupTag } } else -> { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/VariableStorage.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/VariableStorage.kt index 282732b54c1..db9e5223a30 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/VariableStorage.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/VariableStorage.kt @@ -8,11 +8,10 @@ package org.jetbrains.kotlin.fir.resolve.dfa import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject import org.jetbrains.kotlin.fir.declarations.FirProperty -import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor import org.jetbrains.kotlin.fir.declarations.modality +import org.jetbrains.kotlin.fir.dispatchReceiverClassOrNull import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression import org.jetbrains.kotlin.fir.references.FirThisReference @@ -164,14 +163,14 @@ class VariableStorage(private val session: FirSession) { property.getter.let { it != null && it !is FirDefaultPropertyAccessor } -> false property.modality != Modality.FINAL -> { val dispatchReceiver = (originalFir as? FirQualifiedAccess)?.dispatchReceiver ?: return false - val propertyClassName = (this as FirPropertySymbol).let { it.overriddenSymbol ?: it }.callableId.classId + val propertyClassLookupTag = (this as FirPropertySymbol).let { it.overriddenSymbol ?: it }.dispatchReceiverClassOrNull() val receiverType = dispatchReceiver.typeRef.coneTypeSafe()?.fullyExpandedType(session) ?: return false val receiverSymbol = receiverType.fullyExpandedType(session).lookupTag.toSymbol(session) ?: return false - val receiverClassName = receiverSymbol.classId - if (propertyClassName != receiverClassName) { + val receiverClassLookupTag = receiverSymbol.toLookupTag() + if (propertyClassLookupTag != receiverClassLookupTag) { when (val receiverFir = receiverSymbol.fir) { - is FirAnonymousObject -> true - is FirRegularClass -> receiverFir.modality == Modality.FINAL + is org.jetbrains.kotlin.fir.declarations.FirAnonymousObject -> true + is org.jetbrains.kotlin.fir.declarations.FirRegularClass -> receiverFir.modality == Modality.FINAL else -> throw IllegalStateException("Should not be here: $receiverFir") } } else false diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt index 62cb3c4d51e..254d768a19c 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt @@ -5,13 +5,11 @@ package org.jetbrains.kotlin.fir.resolve.transformers.body.resolve -import org.jetbrains.kotlin.fir.FirElement -import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind -import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.resolve.ResolutionMode import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.firProvider @@ -245,7 +243,7 @@ private class ReturnTypeCalculatorWithJump( } else { val file = provider.getFirCallableContainerFile(symbol) - val outerClasses = generateSequence(id.classId) { classId -> + val outerClasses = generateSequence(symbol.containingClass()?.classId) { classId -> classId.outerClassId }.mapTo(mutableListOf()) { provider.getFirClassifierByFqName(it) } diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/file/structure/FileStructure.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/file/structure/FileStructure.kt index 96b6cb1c8b6..973b4d7aeae 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/file/structure/FileStructure.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/file/structure/FileStructure.kt @@ -6,7 +6,9 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.file.structure import org.jetbrains.kotlin.diagnostics.Diagnostic +import org.jetbrains.kotlin.fir.containingClass import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.getNonLocalContainingOrThisDeclaration import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.FirFileBuilder import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache @@ -74,9 +76,9 @@ internal class FileStructure( val declarations = if (from.symbol.callableId.className == null) { firFile.declarations as MutableList } else { - val classId = from.symbol.callableId.classId + val classLikeLookupTag = from.containingClass() ?: error("Class name should not be null for non-top-level & non-local declarations") - val containingClass = firIdeProvider.getFirClassifierByFqName(classId) as FirRegularClass + val containingClass = classLikeLookupTag.toSymbol(firFile.session)?.fir as FirRegularClass containingClass.declarations as MutableList } declarations.replaceFirst(from, to) diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/lazy/resolve/FirLazyDeclarationResolver.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/lazy/resolve/FirLazyDeclarationResolver.kt index 28c4081318a..d9d436f897a 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/lazy/resolve/FirLazyDeclarationResolver.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/lazy/resolve/FirLazyDeclarationResolver.kt @@ -5,24 +5,26 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve +import org.jetbrains.kotlin.fir.containingClass import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.resolve.ResolutionMode import org.jetbrains.kotlin.fir.resolve.providers.FirProvider import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.FirTowerDataContextCollector -import org.jetbrains.kotlin.idea.fir.low.level.api.trasformers.FirDesignatedBodyResolveTransformerForIDE import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.getNonLocalContainingOrThisDeclaration import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.FirFileBuilder import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache import org.jetbrains.kotlin.idea.fir.low.level.api.providers.firIdeProvider +import org.jetbrains.kotlin.idea.fir.low.level.api.trasformers.FirDesignatedBodyResolveTransformerForIDE import org.jetbrains.kotlin.idea.fir.low.level.api.trasformers.FirDesignatedContractsResolveTransformerForIDE import org.jetbrains.kotlin.idea.fir.low.level.api.trasformers.FirDesignatedImplicitTypesTransformerForIDE import org.jetbrains.kotlin.idea.fir.low.level.api.util.checkCanceled import org.jetbrains.kotlin.idea.fir.low.level.api.util.executeWithoutPCE import org.jetbrains.kotlin.idea.fir.low.level.api.util.findSourceNonLocalFirDeclaration import org.jetbrains.kotlin.idea.fir.low.level.api.util.getContainingFile -import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.psi.KtPsiUtil internal class FirLazyDeclarationResolver( private val firFileBuilder: FirFileBuilder @@ -132,7 +134,7 @@ internal class FirLazyDeclarationResolver( if (nonLocalDeclarationToResolve !is FirFile) { val id = when (nonLocalDeclarationToResolve) { is FirCallableDeclaration<*> -> { - nonLocalDeclarationToResolve.symbol.callableId.classId + nonLocalDeclarationToResolve.containingClass()?.classId } is FirClassLikeDeclaration<*> -> { nonLocalDeclarationToResolve.symbol.classId diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeDeserializedDeclarationSourceProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeDeserializedDeclarationSourceProvider.kt index ac148068fb7..0d885bd75c2 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeDeserializedDeclarationSourceProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeDeserializedDeclarationSourceProvider.kt @@ -10,6 +10,7 @@ import com.intellij.psi.PsiElement import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.containingClass import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.FirIdeSession @@ -116,7 +117,7 @@ object FirIdeDeserializedDeclarationSourceProvider { } private fun FirCallableDeclaration<*>.containingKtClass(project: Project): KtClassOrObject? = - unrollFakeOverrides().symbol.callableId.classId?.let { classByClassId(it, scope(project), project) } + unrollFakeOverrides().containingClass()?.classId?.let { classByClassId(it, scope(project), project) } private fun classByClassId(classId: ClassId, scope: GlobalSearchScope, project: Project): KtClassOrObject? { val fqName = classId.asStringForUsingInIndexes().let { classIdMapping[it] ?: it } @@ -143,4 +144,4 @@ fun FirElement.findPsi(project: Project): PsiElement? = psi ?: FirIdeDeserializedDeclarationSourceProvider.findPsi(this, project) fun FirElement.findPsi(session: FirSession): PsiElement? = - findPsi((session as FirIdeSession).project) \ No newline at end of file + findPsi((session as FirIdeSession).project) diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirConstructorSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirConstructorSymbol.kt index c9e0d032593..57dc27adc99 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirConstructorSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirConstructorSymbol.kt @@ -6,22 +6,24 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.fir.containingClass import org.jetbrains.kotlin.fir.declarations.FirConstructor import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl import org.jetbrains.kotlin.idea.fir.findPsi import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState import org.jetbrains.kotlin.idea.frontend.api.ValidityToken -import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.KtFirConstructorSymbolPointer import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.createSignature 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.KtConstructorParameterSymbol +import org.jetbrains.kotlin.idea.frontend.api.symbols.KtConstructorSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.CanNotCreateSymbolPointerForLocalLibraryDeclarationException import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer +import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion import org.jetbrains.kotlin.name.ClassId @@ -43,7 +45,7 @@ internal class KtFirConstructorSymbol( } override val containingClassIdIfNonLocal: ClassId? - get() = firRef.withFir { fir -> fir.symbol.callableId.classId /* TODO check if local */ } + get() = firRef.withFir { fir -> fir.containingClass()?.classId /* TODO check if local */ } override val isPrimary: Boolean get() = firRef.withFir { it.isPrimary } @@ -56,4 +58,4 @@ internal class KtFirConstructorSymbol( ?: error("ClassId should present for member declaration") return KtFirConstructorSymbolPointer(ownerClassId, isPrimary, firRef.withFir { it.createSignature() }) } -} \ No newline at end of file +} diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirEnumEntrySymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirEnumEntrySymbol.kt index 3436bebd86a..981efd4e959 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirEnumEntrySymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirEnumEntrySymbol.kt @@ -6,12 +6,12 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.fir.containingClass import org.jetbrains.kotlin.fir.declarations.FirEnumEntry import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.idea.fir.findPsi import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState import org.jetbrains.kotlin.idea.frontend.api.ValidityToken -import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.KtFirEnumEntrySymbolPointer import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.createSignature @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef import org.jetbrains.kotlin.idea.frontend.api.symbols.KtEnumEntrySymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer +import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name @@ -35,10 +36,10 @@ internal class KtFirEnumEntrySymbol( override val type: KtType by firRef.withFirAndCache(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) { fir -> builder.buildKtType(fir.returnTypeRef) } override val containingEnumClassIdIfNonLocal: ClassId? - get() = firRef.withFir { it.symbol.callableId.classId?.takeUnless { it.isLocal } } + get() = firRef.withFir { it.containingClass()?.classId?.takeUnless { it.isLocal } } override fun createPointer(): KtSymbolPointer { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } return KtFirEnumEntrySymbolPointer(containingEnumClassIdIfNonLocal!!, firRef.withFir { it.createSignature() }) } -} \ No newline at end of file +} diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFunctionSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFunctionSymbol.kt index 33e46f5be3e..897fb72a6b9 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFunctionSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFunctionSymbol.kt @@ -6,22 +6,23 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.fir.containingClass import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl import org.jetbrains.kotlin.idea.fir.findPsi import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState import org.jetbrains.kotlin.idea.frontend.api.ValidityToken -import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.KtFirMemberFunctionSymbolPointer import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.createSignature 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.KtFunctionSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtCommonSymbolModality import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.CanNotCreateSymbolPointerForLocalLibraryDeclarationException import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer +import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -59,7 +60,7 @@ internal class KtFirFunctionSymbol( get() = firRef.withFir { fir -> when { fir.isLocal -> KtSymbolKind.LOCAL - fir.symbol.callableId.classId == null -> KtSymbolKind.TOP_LEVEL + fir.containingClass()?.classId == null -> KtSymbolKind.TOP_LEVEL else -> KtSymbolKind.MEMBER } } @@ -70,7 +71,7 @@ internal class KtFirFunctionSymbol( return when (symbolKind) { KtSymbolKind.TOP_LEVEL -> TODO("Creating symbol for top level fun is not supported yet") KtSymbolKind.MEMBER -> KtFirMemberFunctionSymbolPointer( - firRef.withFir { it.symbol.callableId.classId ?: error("ClassId should not be null for member function") }, + firRef.withFir { it.containingClass()?.classId ?: error("ClassId should not be null for member function") }, firRef.withFir { it.createSignature() } ) KtSymbolKind.NON_PROPERTY_PARAMETER -> error("KtFunction could not be a parameter") @@ -79,4 +80,4 @@ internal class KtFirFunctionSymbol( ) } } -} \ No newline at end of file +} diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertySymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertySymbol.kt index 179d1965f14..9b07a20d881 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertySymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertySymbol.kt @@ -6,12 +6,12 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.fir.containingClass import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.idea.fir.findPsi import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState import org.jetbrains.kotlin.idea.frontend.api.ValidityToken -import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.KtFirMemberPropertySymbolPointer import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.createSignature @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.CanNotCreateSymbolPointerForLocalLibraryDeclarationException import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer +import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -45,7 +46,7 @@ internal class KtFirPropertySymbol( override val isExtension: Boolean get() = firRef.withFir { it.receiverTypeRef != null } override val symbolKind: KtSymbolKind get() = firRef.withFir { fir -> - when (fir.symbol.callableId.classId) { + when (fir.containingClass()?.classId) { null -> KtSymbolKind.TOP_LEVEL else -> KtSymbolKind.MEMBER } @@ -63,10 +64,10 @@ internal class KtFirPropertySymbol( KtSymbolKind.TOP_LEVEL -> TODO("Creating symbol for top level fun is not supported yet") KtSymbolKind.NON_PROPERTY_PARAMETER -> TODO("Creating symbol for top level parameters is not supported yet") KtSymbolKind.MEMBER -> KtFirMemberPropertySymbolPointer( - firRef.withFir { it.symbol.callableId.classId ?: error("ClassId should not be null for member property") }, + firRef.withFir { it.containingClass()?.classId ?: error("ClassId should not be null for member property") }, firRef.withFir { it.createSignature() } ) KtSymbolKind.LOCAL -> throw CanNotCreateSymbolPointerForLocalLibraryDeclarationException(name.asString()) } } -} \ No newline at end of file +} diff --git a/plugins/fir/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/AllOpenVisibilityTransformer.kt b/plugins/fir/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/AllOpenVisibilityTransformer.kt index 03385adabee..b034ea958ee 100644 --- a/plugins/fir/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/AllOpenVisibilityTransformer.kt +++ b/plugins/fir/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/AllOpenVisibilityTransformer.kt @@ -5,9 +5,10 @@ package org.jetbrains.kotlin.fir.plugin -import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibility +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.containingClass import org.jetbrains.kotlin.fir.declarations.FirAnnotatedDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus @@ -61,7 +62,7 @@ class AllOpenVisibilityTransformer(session: FirSession) : FirStatusTransformerEx } ?: return null val argument = annotation.arguments.firstOrNull() as? FirQualifiedAccessExpression ?: return null val symbol = (argument.calleeReference as? FirResolvedNamedReference)?.resolvedSymbol as? FirVariableSymbol<*> ?: return null - val name = symbol.callableId.takeIf { it.classId == VisibilityClassId }?.callableName ?: return null + val name = symbol.takeIf { it.containingClass()?.classId == VisibilityClassId }?.callableId?.callableName ?: return null return when (name) { PublicName -> Visibilities.Public InternalName -> Visibilities.Internal