FIR: Get rid of CallableId::classId usages
Use dispatchReceiverType or containingClassAttr instead
This commit is contained in:
@@ -7,11 +7,12 @@ package org.jetbrains.kotlin.fir.analysis.checkers
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
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.Visibilities
|
||||||
import org.jetbrains.kotlin.descriptors.Visibility
|
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.analysis.checkers.context.CheckerContext
|
||||||
|
import org.jetbrains.kotlin.fir.containingClass
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
|
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.ProcessorAction
|
||||||
import org.jetbrains.kotlin.fir.scopes.processOverriddenFunctions
|
import org.jetbrains.kotlin.fir.scopes.processOverriddenFunctions
|
||||||
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
|
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.FirFunctionSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||||
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
||||||
@@ -142,18 +142,8 @@ inline fun <reified T : Any> FirQualifiedAccessExpression.getDeclaration(): T? {
|
|||||||
* Returns the ClassLikeDeclaration where the Fir object has been defined
|
* Returns the ClassLikeDeclaration where the Fir object has been defined
|
||||||
* or null if no proper declaration has been found.
|
* or null if no proper declaration has been found.
|
||||||
*/
|
*/
|
||||||
fun FirSymbolOwner<*>.getContainingClass(context: CheckerContext): FirClassLikeDeclaration<*>? {
|
fun FirSymbolOwner<*>.getContainingClass(context: CheckerContext): FirClassLikeDeclaration<*>? =
|
||||||
val classId = this.symbol.safeAs<FirCallableSymbol<*>>()
|
this.safeAs<FirCallableMemberDeclaration<*>>()?.containingClass()?.toSymbol(context.session)?.fir
|
||||||
?.callableId
|
|
||||||
?.classId
|
|
||||||
?: return null
|
|
||||||
|
|
||||||
if (!classId.isLocal) {
|
|
||||||
return context.session.firSymbolProvider.getClassLikeSymbolByFqName(classId)?.fir
|
|
||||||
}
|
|
||||||
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the FirClassLikeDeclaration the type alias is pointing
|
* Returns the FirClassLikeDeclaration the type alias is pointing
|
||||||
|
|||||||
+3
-14
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.analysis.checkers.expression
|
|||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
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.DiagnosticReporter
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
|
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.expressions.FirQualifiedAccessExpression
|
||||||
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
|
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
|
||||||
import org.jetbrains.kotlin.fir.references.FirSuperReference
|
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.fir.symbols.impl.FirRegularClassSymbol
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||||
|
|
||||||
@@ -45,17 +44,7 @@ object FirSuperclassNotAccessibleFromInterfaceChecker : FirQualifiedAccessChecke
|
|||||||
* or null if no proper declaration has been found.
|
* or null if no proper declaration has been found.
|
||||||
*/
|
*/
|
||||||
private fun getClassLikeDeclaration(functionCall: FirQualifiedAccessExpression, context: CheckerContext): FirClassLikeDeclaration<*>? {
|
private fun getClassLikeDeclaration(functionCall: FirQualifiedAccessExpression, context: CheckerContext): FirClassLikeDeclaration<*>? {
|
||||||
val classId = functionCall.calleeReference.safeAs<FirResolvedNamedReference>()
|
return functionCall.calleeReference.safeAs<FirResolvedNamedReference>()?.resolvedSymbol?.fir?.getContainingClass(context)
|
||||||
?.resolvedSymbol.safeAs<FirNamedFunctionSymbol>()
|
|
||||||
?.callableId
|
|
||||||
?.classId
|
|
||||||
?: return null
|
|
||||||
|
|
||||||
if (!classId.isLocal) {
|
|
||||||
return context.session.firSymbolProvider.getClassLikeSymbolByFqName(classId)?.fir
|
|
||||||
}
|
|
||||||
|
|
||||||
return null
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun DiagnosticReporter.report(source: FirSourceElement?) {
|
private fun DiagnosticReporter.report(source: FirSourceElement?) {
|
||||||
@@ -63,4 +52,4 @@ object FirSuperclassNotAccessibleFromInterfaceChecker : FirQualifiedAccessChecke
|
|||||||
report(FirErrors.SUPERCLASS_NOT_ACCESSIBLE_FROM_INTERFACE.on(it))
|
report(FirErrors.SUPERCLASS_NOT_ACCESSIBLE_FROM_INTERFACE.on(it))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-6
@@ -9,9 +9,7 @@ import com.intellij.lang.LighterASTNode
|
|||||||
import com.intellij.openapi.util.Ref
|
import com.intellij.openapi.util.Ref
|
||||||
import com.intellij.psi.tree.IElementType
|
import com.intellij.psi.tree.IElementType
|
||||||
import org.jetbrains.kotlin.KtNodeTypes
|
import org.jetbrains.kotlin.KtNodeTypes
|
||||||
import org.jetbrains.kotlin.fir.FirFakeSourceElementKind
|
import org.jetbrains.kotlin.fir.*
|
||||||
import org.jetbrains.kotlin.fir.FirLightSourceElement
|
|
||||||
import org.jetbrains.kotlin.fir.FirPsiSourceElement
|
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirExpressionChecker
|
import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirExpressionChecker
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
|
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.FirFunctionCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment
|
import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment
|
||||||
import org.jetbrains.kotlin.fir.expressions.toResolvedCallableSymbol
|
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.references.FirResolvedNamedReference
|
||||||
import org.jetbrains.kotlin.fir.symbols.StandardClassIds
|
import org.jetbrains.kotlin.fir.symbols.StandardClassIds
|
||||||
import org.jetbrains.kotlin.fir.types.classId
|
import org.jetbrains.kotlin.fir.types.classId
|
||||||
@@ -41,7 +38,7 @@ object CanBeReplacedWithOperatorAssignmentChecker : FirExpressionChecker<FirVari
|
|||||||
val rValueClassId = rValue.explicitReceiver?.typeRef?.coneType?.classId
|
val rValueClassId = rValue.explicitReceiver?.typeRef?.coneType?.classId
|
||||||
if (rValueClassId !in StandardClassIds.primitiveTypes) return
|
if (rValueClassId !in StandardClassIds.primitiveTypes) return
|
||||||
val rValueResolvedSymbol = rValue.toResolvedCallableSymbol() ?: return
|
val rValueResolvedSymbol = rValue.toResolvedCallableSymbol() ?: return
|
||||||
if (rValueResolvedSymbol.callableId.classId !in StandardClassIds.primitiveTypes) return
|
if (rValueResolvedSymbol.dispatchReceiverClassOrNull()?.classId !in StandardClassIds.primitiveTypes) return
|
||||||
|
|
||||||
var needToReport = false
|
var needToReport = false
|
||||||
val assignmentSource = expression.source
|
val assignmentSource = expression.source
|
||||||
@@ -144,4 +141,4 @@ object CanBeReplacedWithOperatorAssignmentChecker : FirExpressionChecker<FirVari
|
|||||||
private fun LighterASTNode.canBeAugmented() = this.toString().let {
|
private fun LighterASTNode.canBeAugmented() = this.toString().let {
|
||||||
it == "+" || it == "*" || it == "-" || it == "/" || it == "%"
|
it == "+" || it == "*" || it == "-" || it == "/" || it == "%"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -26,7 +26,7 @@ import org.jetbrains.kotlin.lexer.KtTokens
|
|||||||
|
|
||||||
object UnusedChecker : FirControlFlowChecker() {
|
object UnusedChecker : FirControlFlowChecker() {
|
||||||
override fun analyze(graph: ControlFlowGraph, reporter: DiagnosticReporter, checkerContext: CheckerContext) {
|
override fun analyze(graph: ControlFlowGraph, reporter: DiagnosticReporter, checkerContext: CheckerContext) {
|
||||||
if ((graph.declaration as? FirSymbolOwner<*>)?.getContainingClass(checkerContext) != null) return
|
if ((graph.declaration as? FirSymbolOwner<*>)?.getContainingClass(checkerContext)?.takeIf { !it.symbol.classId.isLocal }!= null) return
|
||||||
val properties = LocalPropertyCollector.collect(graph)
|
val properties = LocalPropertyCollector.collect(graph)
|
||||||
if (properties.isEmpty()) return
|
if (properties.isEmpty()) return
|
||||||
|
|
||||||
@@ -203,4 +203,4 @@ object UnusedChecker : FirControlFlowChecker() {
|
|||||||
|
|
||||||
private val FirPropertySymbol.identifierSource: FirSourceElement?
|
private val FirPropertySymbol.identifierSource: FirSourceElement?
|
||||||
get() = fir.source?.getChild(KtTokens.IDENTIFIER, 0, 1)
|
get() = fir.source?.getChild(KtTokens.IDENTIFIER, 0, 1)
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -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.backend.common.serialization.mangle.collectForMangler
|
||||||
import org.jetbrains.kotlin.fir.FirElement
|
import org.jetbrains.kotlin.fir.FirElement
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.containingClass
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.render
|
import org.jetbrains.kotlin.fir.render
|
||||||
import org.jetbrains.kotlin.fir.resolve.firSymbolProvider
|
import org.jetbrains.kotlin.fir.resolve.firSymbolProvider
|
||||||
@@ -75,7 +76,7 @@ open class FirJvmMangleComputer(
|
|||||||
|
|
||||||
private fun FirDeclaration.visitParent() {
|
private fun FirDeclaration.visitParent() {
|
||||||
val (parentPackageFqName, parentClassId) = when (this) {
|
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 }
|
is FirClassLikeDeclaration<*> -> this.symbol.classId.let { it.packageFqName to it.outerClassId }
|
||||||
else -> return
|
else -> return
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -10,8 +10,8 @@ import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings
|
|||||||
import org.jetbrains.kotlin.codegen.state.GenerationState
|
import org.jetbrains.kotlin.codegen.state.GenerationState
|
||||||
import org.jetbrains.kotlin.config.JvmDefaultMode
|
import org.jetbrains.kotlin.config.JvmDefaultMode
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
|
||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.backend.FirMetadataSource
|
import org.jetbrains.kotlin.fir.backend.FirMetadataSource
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.resolve.firProvider
|
import org.jetbrains.kotlin.fir.resolve.firProvider
|
||||||
@@ -279,7 +279,7 @@ class FirJvmSerializerExtension(
|
|||||||
if (!hasJvmFieldAnnotation) return false
|
if (!hasJvmFieldAnnotation) return false
|
||||||
|
|
||||||
val container =
|
val container =
|
||||||
symbol.callableId.classId?.let {
|
dispatchReceiverType?.classId?.let {
|
||||||
session.firProvider.getFirClassifierByFqName(it) as? FirRegularClass
|
session.firProvider.getFirClassifierByFqName(it) as? FirRegularClass
|
||||||
}
|
}
|
||||||
if (container == null || !container.isCompanion) {
|
if (container == null || !container.isCompanion) {
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.fir.resolve.*
|
|||||||
import org.jetbrains.kotlin.fir.resolve.calls.SyntheticPropertySymbol
|
import org.jetbrains.kotlin.fir.resolve.calls.SyntheticPropertySymbol
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
|
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
|
||||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
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.processDirectlyOverriddenFunctions
|
||||||
import org.jetbrains.kotlin.fir.scopes.processDirectlyOverriddenProperties
|
import org.jetbrains.kotlin.fir.scopes.processDirectlyOverriddenProperties
|
||||||
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
|
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<*> {
|
internal tailrec fun FirCallableSymbol<*>.deepestMatchingOverriddenSymbol(root: FirCallableSymbol<*> = this): FirCallableSymbol<*> {
|
||||||
if (isIntersectionOverride) return this
|
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)
|
return overriddenSymbol.deepestMatchingOverriddenSymbol(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -235,7 +238,11 @@ internal fun FirSimpleFunction.generateOverriddenFunctionSymbols(
|
|||||||
if ((it.fir as FirSimpleFunction).visibility == Visibilities.Private) {
|
if ((it.fir as FirSimpleFunction).visibility == Visibilities.Private) {
|
||||||
return@processDirectlyOverriddenFunctions ProcessorAction.NEXT
|
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
|
overriddenSet += overridden as IrSimpleFunctionSymbol
|
||||||
ProcessorAction.NEXT
|
ProcessorAction.NEXT
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-6
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.fir.backend
|
|||||||
import org.jetbrains.kotlin.KtNodeTypes
|
import org.jetbrains.kotlin.KtNodeTypes
|
||||||
import org.jetbrains.kotlin.builtins.StandardNames.BUILT_INS_PACKAGE_FQ_NAMES
|
import org.jetbrains.kotlin.builtins.StandardNames.BUILT_INS_PACKAGE_FQ_NAMES
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
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.AnnotationGenerator
|
||||||
import org.jetbrains.kotlin.fir.backend.generators.DelegatedMemberGenerator
|
import org.jetbrains.kotlin.fir.backend.generators.DelegatedMemberGenerator
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
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.Fir2IrLazyConstructor
|
||||||
import org.jetbrains.kotlin.fir.lazy.Fir2IrLazyProperty
|
import org.jetbrains.kotlin.fir.lazy.Fir2IrLazyProperty
|
||||||
import org.jetbrains.kotlin.fir.lazy.Fir2IrLazySimpleFunction
|
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.firProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.firSymbolProvider
|
import org.jetbrains.kotlin.fir.resolve.firSymbolProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.inference.isSuspendFunctionType
|
import org.jetbrains.kotlin.fir.resolve.inference.isSuspendFunctionType
|
||||||
@@ -236,7 +235,7 @@ class Fir2IrDeclarationStorage(
|
|||||||
internal fun findIrParent(callableDeclaration: FirCallableDeclaration<*>): IrDeclarationParent? {
|
internal fun findIrParent(callableDeclaration: FirCallableDeclaration<*>): IrDeclarationParent? {
|
||||||
val firBasedSymbol = callableDeclaration.symbol
|
val firBasedSymbol = callableDeclaration.symbol
|
||||||
val callableId = firBasedSymbol.callableId
|
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?) {
|
private fun IrDeclaration.setAndModifyParent(irParent: IrDeclarationParent?) {
|
||||||
@@ -977,7 +976,8 @@ class Fir2IrDeclarationStorage(
|
|||||||
val firConstructor = firConstructorSymbol.fir
|
val firConstructor = firConstructorSymbol.fir
|
||||||
getCachedIrConstructor(firConstructor)?.let { return it.symbol }
|
getCachedIrConstructor(firConstructor)?.let { return it.symbol }
|
||||||
val signature = signatureComposer.composeSignature(firConstructor)
|
val signature = signatureComposer.composeSignature(firConstructor)
|
||||||
val irParent = findIrParent(firConstructor) as IrClass
|
val irParent = findIrParent(firConstructor) as? IrClass
|
||||||
|
?: error("sadsad")
|
||||||
val parentOrigin = irParent.origin
|
val parentOrigin = irParent.origin
|
||||||
if (signature != null) {
|
if (signature != null) {
|
||||||
symbolTable.referenceConstructorIfAny(signature)?.let { irConstructorSymbol ->
|
symbolTable.referenceConstructorIfAny(signature)?.let { irConstructorSymbol ->
|
||||||
@@ -1100,7 +1100,7 @@ class Fir2IrDeclarationStorage(
|
|||||||
symbolTable.declareProperty(signature, { symbol }) {
|
symbolTable.declareProperty(signature, { symbol }) {
|
||||||
val isFakeOverride =
|
val isFakeOverride =
|
||||||
firPropertySymbol.isFakeOverride &&
|
firPropertySymbol.isFakeOverride &&
|
||||||
firPropertySymbol.callableId != firPropertySymbol.overriddenSymbol?.callableId
|
firPropertySymbol.dispatchReceiverClassOrNull() != firPropertySymbol.overriddenSymbol?.dispatchReceiverClassOrNull()
|
||||||
Fir2IrLazyProperty(
|
Fir2IrLazyProperty(
|
||||||
components, startOffset, endOffset, declarationOrigin, fir, irParent.fir, symbol, isFakeOverride
|
components, startOffset, endOffset, declarationOrigin, fir, irParent.fir, symbol, isFakeOverride
|
||||||
).apply {
|
).apply {
|
||||||
@@ -1154,7 +1154,7 @@ class Fir2IrDeclarationStorage(
|
|||||||
is FirEnumEntry -> {
|
is FirEnumEntry -> {
|
||||||
classifierStorage.getCachedIrEnumEntry(firDeclaration)?.let { return it.symbol }
|
classifierStorage.getCachedIrEnumEntry(firDeclaration)?.let { return it.symbol }
|
||||||
val containingFile = firProvider.getFirCallableContainerFile(firVariableSymbol)
|
val containingFile = firProvider.getFirCallableContainerFile(firVariableSymbol)
|
||||||
val irParentClass = firVariableSymbol.callableId.classId?.let { findIrClass(it) }
|
val irParentClass = firDeclaration.containingClass()?.classId?.let { findIrClass(it) }
|
||||||
classifierStorage.createIrEnumEntry(
|
classifierStorage.createIrEnumEntry(
|
||||||
firDeclaration,
|
firDeclaration,
|
||||||
irParent = irParentClass,
|
irParent = irParentClass,
|
||||||
|
|||||||
+3
-2
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.backend.generators
|
|||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
import org.jetbrains.kotlin.fir.backend.*
|
import org.jetbrains.kotlin.fir.backend.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
|
import org.jetbrains.kotlin.fir.dispatchReceiverClassOrNull
|
||||||
import org.jetbrains.kotlin.fir.expressions.*
|
import org.jetbrains.kotlin.fir.expressions.*
|
||||||
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
|
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
|
||||||
import org.jetbrains.kotlin.fir.psi
|
import org.jetbrains.kotlin.fir.psi
|
||||||
@@ -401,9 +402,9 @@ class CallAndReferenceGenerator(
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
val resolvedReference = callableReferenceAccess.calleeReference as FirResolvedNamedReference
|
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
|
// Make sure the reference indeed refers to a member of that companion
|
||||||
if (callableId.classId != classSymbol.classId) {
|
if (firCallableSymbol.dispatchReceiverClassOrNull() != classSymbol.toLookupTag()) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.backend.*
|
|||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter
|
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter
|
||||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertySetter
|
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.FirDelegatedConstructorCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||||
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
|
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
|
||||||
@@ -124,7 +125,7 @@ internal class ClassMemberGenerator(
|
|||||||
irFunction.body = IrSyntheticBodyImpl(startOffset, endOffset, kind)
|
irFunction.body = IrSyntheticBodyImpl(startOffset, endOffset, kind)
|
||||||
}
|
}
|
||||||
irFunction.parent is IrClass && irFunction.parentAsClass.isData -> {
|
irFunction.parent is IrClass && irFunction.parentAsClass.isData -> {
|
||||||
val classId = firFunction?.symbol?.callableId?.classId
|
val classId = firFunction?.symbol?.dispatchReceiverClassOrNull()?.classId
|
||||||
when {
|
when {
|
||||||
DataClassMembersGenerator.isComponentN(irFunction) ->
|
DataClassMembersGenerator.isComponentN(irFunction) ->
|
||||||
firFunction?.body?.let { irFunction.body = visitor.convertToIrBlockBody(it) }
|
firFunction?.body?.let { irFunction.body = visitor.convertToIrBlockBody(it) }
|
||||||
|
|||||||
+4
-2
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
|||||||
import org.jetbrains.kotlin.fir.symbols.PossiblyFirFakeOverrideSymbol
|
import org.jetbrains.kotlin.fir.symbols.PossiblyFirFakeOverrideSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.StandardClassIds
|
import org.jetbrains.kotlin.fir.symbols.StandardClassIds
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
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.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrBlockBody
|
import org.jetbrains.kotlin.ir.expressions.IrBlockBody
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
|
||||||
@@ -84,7 +85,7 @@ internal class DelegatedMemberGenerator(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private inline fun <reified S, reified D : FirCallableDeclaration<D>> S.unwrapDelegateTarget(
|
private inline fun <reified S, reified D : FirCallableMemberDeclaration<D>> S.unwrapDelegateTarget(
|
||||||
subClassLookupTag: ConeClassLikeLookupTag,
|
subClassLookupTag: ConeClassLikeLookupTag,
|
||||||
noinline directOverridden: S.() -> List<S>,
|
noinline directOverridden: S.() -> List<S>,
|
||||||
firField: FirField,
|
firField: FirField,
|
||||||
@@ -103,7 +104,8 @@ internal class DelegatedMemberGenerator(
|
|||||||
val wrappedSymbol = wrapped.symbol as? S ?: return null
|
val wrappedSymbol = wrapped.symbol as? S ?: return null
|
||||||
|
|
||||||
return when {
|
return when {
|
||||||
wrappedSymbol.isFakeOverride && wrappedSymbol.callableId.classId == firSubClass.classId ->
|
wrappedSymbol.isFakeOverride &&
|
||||||
|
(wrappedSymbol.fir.dispatchReceiverType as? ConeClassLikeType)?.lookupTag == firSubClass.symbol.toLookupTag() ->
|
||||||
wrapped.symbol.overriddenSymbol!!.fir
|
wrapped.symbol.overriddenSymbol!!.fir
|
||||||
else -> wrapped
|
else -> wrapped
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-7
@@ -149,16 +149,16 @@ class FakeOverrideGenerator(
|
|||||||
scope: FirTypeScope,
|
scope: FirTypeScope,
|
||||||
) where S : FirCallableSymbol<D>, S : PossiblyFirFakeOverrideSymbol<D, S> {
|
) where S : FirCallableSymbol<D>, S : PossiblyFirFakeOverrideSymbol<D, S> {
|
||||||
if (originalSymbol !is S || originalSymbol in realDeclarationSymbols) return
|
if (originalSymbol !is S || originalSymbol in realDeclarationSymbols) return
|
||||||
val classId = klass.symbol.classId
|
val classLookupTag = klass.symbol.toLookupTag()
|
||||||
val originalDeclaration = originalSymbol.fir
|
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
|
if (originalDeclaration.visibility == Visibilities.Private) return
|
||||||
|
|
||||||
val origin = IrDeclarationOrigin.FAKE_OVERRIDE
|
val origin = IrDeclarationOrigin.FAKE_OVERRIDE
|
||||||
val baseSymbol = originalSymbol.deepestOverriddenSymbol() as S
|
val baseSymbol = originalSymbol.deepestOverriddenSymbol() as S
|
||||||
|
|
||||||
if ((originalSymbol.isFakeOverride || originalSymbol.isIntersectionOverride) &&
|
if ((originalSymbol.isFakeOverride || originalSymbol.isIntersectionOverride) &&
|
||||||
originalSymbol.callableId.classId == classId
|
originalSymbol.dispatchReceiverClassOrNull() == classLookupTag
|
||||||
) {
|
) {
|
||||||
// Substitution case
|
// Substitution case
|
||||||
// NB: see comment above about substituted function' parent
|
// NB: see comment above about substituted function' parent
|
||||||
@@ -170,7 +170,7 @@ class FakeOverrideGenerator(
|
|||||||
isLocal
|
isLocal
|
||||||
)
|
)
|
||||||
irDeclaration.parent = irClass
|
irDeclaration.parent = irClass
|
||||||
baseSymbols[irDeclaration] = computeBaseSymbols(originalSymbol, baseSymbol, computeDirectOverridden, scope, classId)
|
baseSymbols[irDeclaration] = computeBaseSymbols(originalSymbol, baseSymbol, computeDirectOverridden, scope, classLookupTag)
|
||||||
result += irDeclaration
|
result += irDeclaration
|
||||||
} else if (originalDeclaration.allowsToHaveFakeOverrideIn(klass)) {
|
} else if (originalDeclaration.allowsToHaveFakeOverrideIn(klass)) {
|
||||||
// Trivial fake override case
|
// Trivial fake override case
|
||||||
@@ -189,7 +189,7 @@ class FakeOverrideGenerator(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
irDeclaration.parent = irClass
|
irDeclaration.parent = irClass
|
||||||
baseSymbols[irDeclaration] = computeBaseSymbols(originalSymbol, baseSymbol, computeDirectOverridden, scope, classId)
|
baseSymbols[irDeclaration] = computeBaseSymbols(originalSymbol, baseSymbol, computeDirectOverridden, scope, classLookupTag)
|
||||||
result += irDeclaration
|
result += irDeclaration
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -199,12 +199,12 @@ class FakeOverrideGenerator(
|
|||||||
basedSymbol: S,
|
basedSymbol: S,
|
||||||
directOverridden: FirTypeScope.(S) -> List<S>,
|
directOverridden: FirTypeScope.(S) -> List<S>,
|
||||||
scope: FirTypeScope,
|
scope: FirTypeScope,
|
||||||
containingClassId: ClassId,
|
containingClass: ConeClassLikeLookupTag,
|
||||||
): List<S> {
|
): List<S> {
|
||||||
if (!symbol.isIntersectionOverride) return listOf(basedSymbol)
|
if (!symbol.isIntersectionOverride) return listOf(basedSymbol)
|
||||||
return scope.directOverridden(symbol).map {
|
return scope.directOverridden(symbol).map {
|
||||||
@Suppress("UNCHECKED_CAST")
|
@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
|
it.overriddenSymbol!! as S
|
||||||
else
|
else
|
||||||
it
|
it
|
||||||
|
|||||||
@@ -5,14 +5,12 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.lazy
|
package org.jetbrains.kotlin.fir.lazy
|
||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
|
||||||
import org.jetbrains.kotlin.descriptors.SourceElement
|
|
||||||
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
|
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
|
||||||
import org.jetbrains.kotlin.fir.backend.declareThisReceiverParameter
|
import org.jetbrains.kotlin.fir.backend.declareThisReceiverParameter
|
||||||
import org.jetbrains.kotlin.fir.backend.toIrType
|
import org.jetbrains.kotlin.fir.backend.toIrType
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
|
import org.jetbrains.kotlin.fir.dispatchReceiverClassOrNull
|
||||||
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
|
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
|
||||||
import org.jetbrains.kotlin.fir.symbols.Fir2IrClassSymbol
|
import org.jetbrains.kotlin.fir.symbols.Fir2IrClassSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
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.IrType
|
||||||
import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
|
import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
|
|
||||||
|
|
||||||
class Fir2IrLazyClass(
|
class Fir2IrLazyClass(
|
||||||
components: Fir2IrComponents,
|
components: Fir2IrComponents,
|
||||||
@@ -140,7 +137,7 @@ class Fir2IrLazyClass(
|
|||||||
result += declarationStorage.getIrFunctionSymbol(declaration.symbol).owner
|
result += declarationStorage.getIrFunctionSymbol(declaration.symbol).owner
|
||||||
} else {
|
} else {
|
||||||
scope.processFunctionsByName(declaration.name) {
|
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()) {
|
if (it.isAbstractMethodOfAny()) {
|
||||||
return@processFunctionsByName
|
return@processFunctionsByName
|
||||||
}
|
}
|
||||||
|
|||||||
+11
-13
@@ -6,16 +6,12 @@
|
|||||||
package org.jetbrains.kotlin.fir.signaturer
|
package org.jetbrains.kotlin.fir.signaturer
|
||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
import org.jetbrains.kotlin.fir.FirElement
|
import org.jetbrains.kotlin.fir.*
|
||||||
import org.jetbrains.kotlin.fir.NoMutableState
|
|
||||||
import org.jetbrains.kotlin.fir.backend.Fir2IrSignatureComposer
|
import org.jetbrains.kotlin.fir.backend.Fir2IrSignatureComposer
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
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.symbols.ConeClassLikeLookupTag
|
||||||
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
|
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
|
||||||
import org.jetbrains.kotlin.ir.util.IdSignature
|
import org.jetbrains.kotlin.ir.util.IdSignature
|
||||||
import org.jetbrains.kotlin.name.FqName
|
|
||||||
|
|
||||||
@NoMutableState
|
@NoMutableState
|
||||||
class FirBasedSignatureComposer(private val mangler: FirMangler) : Fir2IrSignatureComposer {
|
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? {
|
override fun composeSignature(declaration: FirDeclaration, containingClass: ConeClassLikeLookupTag?): IdSignature? {
|
||||||
if (declaration is FirAnonymousObject || declaration is FirAnonymousFunction) return null
|
if (declaration is FirAnonymousObject || declaration is FirAnonymousFunction) return null
|
||||||
if (declaration is FirRegularClass && declaration.classId.isLocal) return null
|
if (declaration is FirRegularClass && declaration.classId.isLocal) return null
|
||||||
if (declaration is FirCallableMemberDeclaration<*>) {
|
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()
|
val builder = SignatureBuilder()
|
||||||
try {
|
try {
|
||||||
@@ -93,11 +87,15 @@ class FirBasedSignatureComposer(private val mangler: FirMangler) : Fir2IrSignatu
|
|||||||
is FirCallableMemberDeclaration<*> -> {
|
is FirCallableMemberDeclaration<*> -> {
|
||||||
if (declaration.visibility == Visibilities.Private) return null
|
if (declaration.visibility == Visibilities.Private) return null
|
||||||
val containingClassId = containingClass?.classId
|
val containingClassId = containingClass?.classId
|
||||||
val baseCallableId = declaration.symbol.callableId
|
|
||||||
val callableId =
|
val classId = containingClassId ?: declaration.containingClass()?.classId
|
||||||
if (containingClassId != null) CallableId(containingClassId, baseCallableId.callableName) else baseCallableId
|
val packageName = classId?.packageFqName ?: declaration.symbol.callableId.packageName
|
||||||
|
val callableName = declaration.symbol.callableId.callableName
|
||||||
|
|
||||||
IdSignature.PublicSignature(
|
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()}")
|
else -> error("Unsupported FIR declaration in signature composer: ${declaration.render()}")
|
||||||
|
|||||||
+4
-3
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.resolve.calls.jvm
|
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.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.resolve.calls.AbstractConeCallConflictResolver
|
import org.jetbrains.kotlin.fir.resolve.calls.AbstractConeCallConflictResolver
|
||||||
import org.jetbrains.kotlin.fir.resolve.calls.Candidate
|
import org.jetbrains.kotlin.fir.resolve.calls.Candidate
|
||||||
@@ -31,10 +32,10 @@ class ConeEquivalentCallConflictResolver(
|
|||||||
val result = mutableSetOf<Candidate>()
|
val result = mutableSetOf<Candidate>()
|
||||||
outerLoop@ for (myCandidate in candidates) {
|
outerLoop@ for (myCandidate in candidates) {
|
||||||
val me = myCandidate.symbol.fir
|
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) {
|
for (otherCandidate in result) {
|
||||||
val other = otherCandidate.symbol.fir
|
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)) {
|
if (areEquivalentTopLevelCallables(me, myCandidate, other, otherCandidate)) {
|
||||||
continue@outerLoop
|
continue@outerLoop
|
||||||
}
|
}
|
||||||
@@ -71,4 +72,4 @@ class ConeEquivalentCallConflictResolver(
|
|||||||
else -> error("Not supported: $declaration")
|
else -> error("Not supported: $declaration")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -117,13 +117,13 @@ open class FirEffectiveVisibilityResolverImpl(private val session: FirSession) :
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun FirDeclaration.getParentClassId(): ClassId? = when (this) {
|
private fun FirDeclaration.getParentClassId(): ClassId? = when (this) {
|
||||||
is FirCallableMemberDeclaration<*> -> this.symbol.callableId.classId
|
is FirCallableMemberDeclaration<*> -> this.containingClass()?.classId
|
||||||
is FirClassLikeDeclaration<*> -> this.symbol.classId.outerClassId
|
is FirClassLikeDeclaration<*> -> this.symbol.classId.outerClassId
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun FirDeclaration.getClassId(): ClassId? = when (this) {
|
private fun FirDeclaration.getClassId(): ClassId? = when (this) {
|
||||||
is FirCallableMemberDeclaration<*> -> this.symbol.callableId.classId
|
is FirCallableMemberDeclaration<*> -> this.containingClass()?.classId
|
||||||
is FirClassLikeDeclaration<*> -> this.symbol.classId
|
is FirClassLikeDeclaration<*> -> this.symbol.classId
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.resolve.firSymbolProvider
|
|||||||
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
|
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
|
||||||
import org.jetbrains.kotlin.fir.resolve.lookupSuperTypes
|
import org.jetbrains.kotlin.fir.resolve.lookupSuperTypes
|
||||||
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
|
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.FirCallableSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||||
@@ -38,11 +39,17 @@ abstract class FirVisibilityChecker : FirSessionComponent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun isVisible(
|
fun <T> isVisible(
|
||||||
declaration: FirMemberDeclaration,
|
declaration: T,
|
||||||
symbol: AbstractFirBasedSymbol<*>,
|
|
||||||
candidate: Candidate
|
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 callInfo = candidate.callInfo
|
||||||
val useSiteFile = callInfo.containingFile
|
val useSiteFile = callInfo.containingFile
|
||||||
val containingDeclarations = callInfo.containingDeclarations
|
val containingDeclarations = callInfo.containingDeclarations
|
||||||
@@ -174,7 +181,7 @@ abstract class FirVisibilityChecker : FirSessionComponent {
|
|||||||
ownerId
|
ownerId
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
is FirCallableSymbol<*> -> callableId.classId
|
is FirCallableSymbol<*> -> containingClass()?.classId
|
||||||
else -> error("Unsupported owner search for ${fir.javaClass}: ${fir.render()}")
|
else -> error("Unsupported owner search for ${fir.javaClass}: ${fir.render()}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-11
@@ -14,7 +14,6 @@ import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
|
|||||||
import org.jetbrains.kotlin.fir.references.FirSuperReference
|
import org.jetbrains.kotlin.fir.references.FirSuperReference
|
||||||
import org.jetbrains.kotlin.fir.resolve.*
|
import org.jetbrains.kotlin.fir.resolve.*
|
||||||
import org.jetbrains.kotlin.fir.resolve.inference.*
|
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.SyntheticSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||||
@@ -226,33 +225,31 @@ internal object CheckVisibility : CheckerStage() {
|
|||||||
val symbol = candidate.symbol
|
val symbol = candidate.symbol
|
||||||
val declaration = symbol.fir
|
val declaration = symbol.fir
|
||||||
if (declaration is FirMemberDeclaration) {
|
if (declaration is FirMemberDeclaration) {
|
||||||
if (!checkVisibility(declaration, symbol, sink, candidate, visibilityChecker)) {
|
if (!checkVisibility(declaration, sink, candidate, visibilityChecker)) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (declaration is FirConstructor) {
|
if (declaration is FirConstructor) {
|
||||||
val ownerClassId = declaration.symbol.callableId.classId!!
|
// TODO: Should be some other form
|
||||||
val provider = declaration.session.firSymbolProvider
|
val classSymbol = declaration.returnTypeRef.coneTypeUnsafe<ConeClassLikeType>().lookupTag.toSymbol(declaration.session)
|
||||||
val classSymbol = provider.getClassLikeSymbolByFqName(ownerClassId)
|
|
||||||
|
|
||||||
if (classSymbol is FirRegularClassSymbol) {
|
if (classSymbol is FirRegularClassSymbol) {
|
||||||
if (classSymbol.fir.classKind.isSingleton) {
|
if (classSymbol.fir.classKind.isSingleton) {
|
||||||
sink.yieldDiagnostic(HiddenCandidate)
|
sink.yieldDiagnostic(HiddenCandidate)
|
||||||
}
|
}
|
||||||
checkVisibility(classSymbol.fir, classSymbol, sink, candidate, visibilityChecker)
|
checkVisibility(classSymbol.fir, sink, candidate, visibilityChecker)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun checkVisibility(
|
private suspend fun <T> checkVisibility(
|
||||||
declaration: FirMemberDeclaration,
|
declaration: T,
|
||||||
symbol: AbstractFirBasedSymbol<*>,
|
|
||||||
sink: CheckerSink,
|
sink: CheckerSink,
|
||||||
candidate: Candidate,
|
candidate: Candidate,
|
||||||
visibilityChecker: FirVisibilityChecker
|
visibilityChecker: FirVisibilityChecker
|
||||||
): Boolean {
|
): Boolean where T : FirMemberDeclaration, T : FirSymbolOwner<*> {
|
||||||
if (!visibilityChecker.isVisible(declaration, symbol, candidate)) {
|
if (!visibilityChecker.isVisible(declaration, candidate)) {
|
||||||
sink.yieldDiagnostic(HiddenCandidate)
|
sink.yieldDiagnostic(HiddenCandidate)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration
|
|||||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
||||||
import org.jetbrains.kotlin.fir.declarations.modality
|
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.FirFunctionCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess
|
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess
|
||||||
import org.jetbrains.kotlin.fir.references.FirNamedReference
|
import org.jetbrains.kotlin.fir.references.FirNamedReference
|
||||||
@@ -146,5 +147,5 @@ private fun BodyResolveComponents.isConcreteMember(supertype: ConeKotlinType, me
|
|||||||
val classSymbol =
|
val classSymbol =
|
||||||
(supertype as? ConeClassLikeType)?.lookupTag?.toSymbol(session) as? FirRegularClassSymbol ?: return true
|
(supertype as? ConeClassLikeType)?.lookupTag?.toSymbol(session) as? FirRegularClassSymbol ?: return true
|
||||||
if (classSymbol.fir.classKind != ClassKind.INTERFACE) 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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
|
|||||||
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
||||||
import org.jetbrains.kotlin.fir.declarations.isStatic
|
import org.jetbrains.kotlin.fir.declarations.isStatic
|
||||||
import org.jetbrains.kotlin.fir.declarations.synthetic.buildSyntheticProperty
|
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.FirScope
|
||||||
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
|
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
|
||||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
||||||
@@ -74,7 +75,7 @@ class FirSyntheticPropertiesScope(
|
|||||||
val parameter = setter.valueParameters.singleOrNull() ?: return
|
val parameter = setter.valueParameters.singleOrNull() ?: return
|
||||||
if (setter.typeParameters.isNotEmpty() || setter.isStatic) return
|
if (setter.typeParameters.isNotEmpty() || setter.isStatic) return
|
||||||
val parameterType = (parameter.returnTypeRef as? FirResolvedTypeRef)?.type ?: 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)) {
|
if (getterReturnType.withNullability(NOT_NULL) != parameterType.withNullability(NOT_NULL)) {
|
||||||
return
|
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 {
|
val property = buildSyntheticProperty {
|
||||||
session = this@FirSyntheticPropertiesScope.session
|
session = this@FirSyntheticPropertiesScope.session
|
||||||
name = propertyName
|
name = propertyName
|
||||||
symbol = SyntheticPropertySymbol(
|
symbol = SyntheticPropertySymbol(
|
||||||
accessorId = getterSymbol.callableId,
|
accessorId = getterSymbol.callableId,
|
||||||
callableId = CallableId(getterSymbol.callableId.packageName, getterSymbol.callableId.className, propertyName)
|
callableId = CallableId(packageName, className, propertyName)
|
||||||
)
|
)
|
||||||
delegateGetter = getter
|
delegateGetter = getter
|
||||||
delegateSetter = matchingSetter
|
delegateSetter = matchingSetter
|
||||||
|
|||||||
+11
-12
@@ -9,22 +9,21 @@ import org.jetbrains.kotlin.fir.FirSession
|
|||||||
import org.jetbrains.kotlin.fir.declarations.FirConstructor
|
import org.jetbrains.kotlin.fir.declarations.FirConstructor
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
|
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
|
||||||
import org.jetbrains.kotlin.fir.declarations.isInner
|
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.FirExpression
|
||||||
import org.jetbrains.kotlin.fir.expressions.builder.buildResolvedQualifier
|
import org.jetbrains.kotlin.fir.expressions.builder.buildResolvedQualifier
|
||||||
import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents
|
import org.jetbrains.kotlin.fir.resolve.*
|
||||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
|
||||||
import org.jetbrains.kotlin.fir.resolve.calls.*
|
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.transformers.body.resolve.resultType
|
||||||
import org.jetbrains.kotlin.fir.resolve.typeForQualifier
|
|
||||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
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.scopes.processClassifiersByName
|
||||||
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
|
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
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.ConeKotlinType
|
||||||
import org.jetbrains.kotlin.fir.types.ConeNullability
|
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.fir.types.withNullability
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||||
@@ -190,13 +189,13 @@ class ScopeTowerLevel(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun dispatchReceiverValue(candidate: FirCallableSymbol<*>): ReceiverValue? {
|
private fun dispatchReceiverValue(candidate: FirCallableSymbol<*>): ReceiverValue? {
|
||||||
val holderId = candidate.callableId.classId
|
val lookupTag = candidate.dispatchReceiverClassOrNull()
|
||||||
if (holderId != null && candidate.fir.origin == FirDeclarationOrigin.ImportedFromObject) {
|
candidate.fir.importedFromObjectClassId?.let { objectClassId ->
|
||||||
val symbol = session.firSymbolProvider.getClassLikeSymbolByFqName(holderId)
|
val symbol = session.firSymbolProvider.getClassLikeSymbolByFqName(objectClassId)
|
||||||
if (symbol is FirRegularClassSymbol) {
|
if (symbol is FirRegularClassSymbol) {
|
||||||
val resolvedQualifier = buildResolvedQualifier {
|
val resolvedQualifier = buildResolvedQualifier {
|
||||||
packageFqName = holderId.packageFqName
|
packageFqName = objectClassId.packageFqName
|
||||||
relativeClassFqName = holderId.relativeClassName
|
relativeClassFqName = objectClassId.relativeClassName
|
||||||
this.symbol = symbol
|
this.symbol = symbol
|
||||||
}.apply {
|
}.apply {
|
||||||
resultType = bodyResolveComponents.typeForQualifier(this)
|
resultType = bodyResolveComponents.typeForQualifier(this)
|
||||||
@@ -206,9 +205,9 @@ class ScopeTowerLevel(
|
|||||||
}
|
}
|
||||||
return when {
|
return when {
|
||||||
candidate !is FirBackingFieldSymbol -> null
|
candidate !is FirBackingFieldSymbol -> null
|
||||||
candidate.callableId.classId != null -> {
|
lookupTag != null -> {
|
||||||
bodyResolveComponents.implicitReceiverStack.lastDispatchReceiver { implicitReceiverValue ->
|
bodyResolveComponents.implicitReceiverStack.lastDispatchReceiver { implicitReceiverValue ->
|
||||||
implicitReceiverValue.type.classId == holderId
|
(implicitReceiverValue.type as? ConeClassLikeType)?.fullyExpandedType(session)?.lookupTag == lookupTag
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else -> {
|
else -> {
|
||||||
|
|||||||
@@ -8,11 +8,10 @@ package org.jetbrains.kotlin.fir.resolve.dfa
|
|||||||
import org.jetbrains.kotlin.descriptors.Modality
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
import org.jetbrains.kotlin.fir.FirElement
|
import org.jetbrains.kotlin.fir.FirElement
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
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.FirProperty
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
|
||||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor
|
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor
|
||||||
import org.jetbrains.kotlin.fir.declarations.modality
|
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.*
|
||||||
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
|
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
|
||||||
import org.jetbrains.kotlin.fir.references.FirThisReference
|
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.getter.let { it != null && it !is FirDefaultPropertyAccessor } -> false
|
||||||
property.modality != Modality.FINAL -> {
|
property.modality != Modality.FINAL -> {
|
||||||
val dispatchReceiver = (originalFir as? FirQualifiedAccess)?.dispatchReceiver ?: return false
|
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<ConeClassLikeType>()?.fullyExpandedType(session) ?: return false
|
val receiverType = dispatchReceiver.typeRef.coneTypeSafe<ConeClassLikeType>()?.fullyExpandedType(session) ?: return false
|
||||||
val receiverSymbol = receiverType.fullyExpandedType(session).lookupTag.toSymbol(session) ?: return false
|
val receiverSymbol = receiverType.fullyExpandedType(session).lookupTag.toSymbol(session) ?: return false
|
||||||
val receiverClassName = receiverSymbol.classId
|
val receiverClassLookupTag = receiverSymbol.toLookupTag()
|
||||||
if (propertyClassName != receiverClassName) {
|
if (propertyClassLookupTag != receiverClassLookupTag) {
|
||||||
when (val receiverFir = receiverSymbol.fir) {
|
when (val receiverFir = receiverSymbol.fir) {
|
||||||
is FirAnonymousObject -> true
|
is org.jetbrains.kotlin.fir.declarations.FirAnonymousObject -> true
|
||||||
is FirRegularClass -> receiverFir.modality == Modality.FINAL
|
is org.jetbrains.kotlin.fir.declarations.FirRegularClass -> receiverFir.modality == Modality.FINAL
|
||||||
else -> throw IllegalStateException("Should not be here: $receiverFir")
|
else -> throw IllegalStateException("Should not be here: $receiverFir")
|
||||||
}
|
}
|
||||||
} else false
|
} else false
|
||||||
|
|||||||
+2
-4
@@ -5,13 +5,11 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.resolve.transformers.body.resolve
|
package org.jetbrains.kotlin.fir.resolve.transformers.body.resolve
|
||||||
|
|
||||||
import org.jetbrains.kotlin.fir.FirElement
|
import org.jetbrains.kotlin.fir.*
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
|
||||||
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
|
||||||
import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
|
import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
|
||||||
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
|
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.ResolutionMode
|
||||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||||
import org.jetbrains.kotlin.fir.resolve.firProvider
|
import org.jetbrains.kotlin.fir.resolve.firProvider
|
||||||
@@ -245,7 +243,7 @@ private class ReturnTypeCalculatorWithJump(
|
|||||||
} else {
|
} else {
|
||||||
val file = provider.getFirCallableContainerFile(symbol)
|
val file = provider.getFirCallableContainerFile(symbol)
|
||||||
|
|
||||||
val outerClasses = generateSequence(id.classId) { classId ->
|
val outerClasses = generateSequence(symbol.containingClass()?.classId) { classId ->
|
||||||
classId.outerClassId
|
classId.outerClassId
|
||||||
}.mapTo(mutableListOf()) { provider.getFirClassifierByFqName(it) }
|
}.mapTo(mutableListOf()) { provider.getFirClassifierByFqName(it) }
|
||||||
|
|
||||||
|
|||||||
+4
-2
@@ -6,7 +6,9 @@
|
|||||||
package org.jetbrains.kotlin.idea.fir.low.level.api.file.structure
|
package org.jetbrains.kotlin.idea.fir.low.level.api.file.structure
|
||||||
|
|
||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
||||||
|
import org.jetbrains.kotlin.fir.containingClass
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
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.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.FirFileBuilder
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache
|
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) {
|
val declarations = if (from.symbol.callableId.className == null) {
|
||||||
firFile.declarations as MutableList<FirDeclaration>
|
firFile.declarations as MutableList<FirDeclaration>
|
||||||
} else {
|
} 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")
|
?: 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<FirDeclaration>
|
containingClass.declarations as MutableList<FirDeclaration>
|
||||||
}
|
}
|
||||||
declarations.replaceFirst(from, to)
|
declarations.replaceFirst(from, to)
|
||||||
|
|||||||
+5
-3
@@ -5,24 +5,26 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve
|
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.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.psi
|
import org.jetbrains.kotlin.fir.psi
|
||||||
import org.jetbrains.kotlin.fir.render
|
import org.jetbrains.kotlin.fir.render
|
||||||
import org.jetbrains.kotlin.fir.resolve.ResolutionMode
|
import org.jetbrains.kotlin.fir.resolve.ResolutionMode
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
|
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.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.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.FirFileBuilder
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache
|
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.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.FirDesignatedContractsResolveTransformerForIDE
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.trasformers.FirDesignatedImplicitTypesTransformerForIDE
|
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.checkCanceled
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.util.executeWithoutPCE
|
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.findSourceNonLocalFirDeclaration
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.util.getContainingFile
|
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(
|
internal class FirLazyDeclarationResolver(
|
||||||
private val firFileBuilder: FirFileBuilder
|
private val firFileBuilder: FirFileBuilder
|
||||||
@@ -132,7 +134,7 @@ internal class FirLazyDeclarationResolver(
|
|||||||
if (nonLocalDeclarationToResolve !is FirFile) {
|
if (nonLocalDeclarationToResolve !is FirFile) {
|
||||||
val id = when (nonLocalDeclarationToResolve) {
|
val id = when (nonLocalDeclarationToResolve) {
|
||||||
is FirCallableDeclaration<*> -> {
|
is FirCallableDeclaration<*> -> {
|
||||||
nonLocalDeclarationToResolve.symbol.callableId.classId
|
nonLocalDeclarationToResolve.containingClass()?.classId
|
||||||
}
|
}
|
||||||
is FirClassLikeDeclaration<*> -> {
|
is FirClassLikeDeclaration<*> -> {
|
||||||
nonLocalDeclarationToResolve.symbol.classId
|
nonLocalDeclarationToResolve.symbol.classId
|
||||||
|
|||||||
+3
-2
@@ -10,6 +10,7 @@ import com.intellij.psi.PsiElement
|
|||||||
import com.intellij.psi.search.GlobalSearchScope
|
import com.intellij.psi.search.GlobalSearchScope
|
||||||
import org.jetbrains.kotlin.fir.FirElement
|
import org.jetbrains.kotlin.fir.FirElement
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.containingClass
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.psi
|
import org.jetbrains.kotlin.fir.psi
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.FirIdeSession
|
import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.FirIdeSession
|
||||||
@@ -116,7 +117,7 @@ object FirIdeDeserializedDeclarationSourceProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun FirCallableDeclaration<*>.containingKtClass(project: Project): KtClassOrObject? =
|
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? {
|
private fun classByClassId(classId: ClassId, scope: GlobalSearchScope, project: Project): KtClassOrObject? {
|
||||||
val fqName = classId.asStringForUsingInIndexes().let { classIdMapping[it] ?: it }
|
val fqName = classId.asStringForUsingInIndexes().let { classIdMapping[it] ?: it }
|
||||||
@@ -143,4 +144,4 @@ fun FirElement.findPsi(project: Project): PsiElement? =
|
|||||||
psi ?: FirIdeDeserializedDeclarationSourceProvider.findPsi(this, project)
|
psi ?: FirIdeDeserializedDeclarationSourceProvider.findPsi(this, project)
|
||||||
|
|
||||||
fun FirElement.findPsi(session: FirSession): PsiElement? =
|
fun FirElement.findPsi(session: FirSession): PsiElement? =
|
||||||
findPsi((session as FirIdeSession).project)
|
findPsi((session as FirIdeSession).project)
|
||||||
|
|||||||
+6
-4
@@ -6,22 +6,24 @@
|
|||||||
package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
|
package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
|
||||||
|
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
|
import org.jetbrains.kotlin.fir.containingClass
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirConstructor
|
import org.jetbrains.kotlin.fir.declarations.FirConstructor
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
|
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
|
||||||
import org.jetbrains.kotlin.idea.fir.findPsi
|
import org.jetbrains.kotlin.idea.fir.findPsi
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
|
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.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.KtSymbolByFirBuilder
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.KtFirConstructorSymbolPointer
|
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.symbols.pointers.createSignature
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef
|
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.markers.KtSymbolKind
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.CanNotCreateSymbolPointerForLocalLibraryDeclarationException
|
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.KtPsiBasedSymbolPointer
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer
|
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.idea.frontend.api.withValidityAssertion
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
|
|
||||||
@@ -43,7 +45,7 @@ internal class KtFirConstructorSymbol(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override val containingClassIdIfNonLocal: ClassId?
|
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 }
|
override val isPrimary: Boolean get() = firRef.withFir { it.isPrimary }
|
||||||
|
|
||||||
@@ -56,4 +58,4 @@ internal class KtFirConstructorSymbol(
|
|||||||
?: error("ClassId should present for member declaration")
|
?: error("ClassId should present for member declaration")
|
||||||
return KtFirConstructorSymbolPointer(ownerClassId, isPrimary, firRef.withFir { it.createSignature() })
|
return KtFirConstructorSymbolPointer(ownerClassId, isPrimary, firRef.withFir { it.createSignature() })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-3
@@ -6,12 +6,12 @@
|
|||||||
package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
|
package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
|
||||||
|
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
|
import org.jetbrains.kotlin.fir.containingClass
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
|
import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
import org.jetbrains.kotlin.idea.fir.findPsi
|
import org.jetbrains.kotlin.idea.fir.findPsi
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
|
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.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.KtSymbolByFirBuilder
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.KtFirEnumEntrySymbolPointer
|
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.KtFirEnumEntrySymbolPointer
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.createSignature
|
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.KtEnumEntrySymbol
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtPsiBasedSymbolPointer
|
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.symbols.pointers.KtSymbolPointer
|
||||||
|
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.Name
|
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 type: KtType by firRef.withFirAndCache(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) { fir -> builder.buildKtType(fir.returnTypeRef) }
|
||||||
|
|
||||||
override val containingEnumClassIdIfNonLocal: ClassId?
|
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<KtEnumEntrySymbol> {
|
override fun createPointer(): KtSymbolPointer<KtEnumEntrySymbol> {
|
||||||
KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it }
|
KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it }
|
||||||
return KtFirEnumEntrySymbolPointer(containingEnumClassIdIfNonLocal!!, firRef.withFir { it.createSignature() })
|
return KtFirEnumEntrySymbolPointer(containingEnumClassIdIfNonLocal!!, firRef.withFir { it.createSignature() })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-5
@@ -6,22 +6,23 @@
|
|||||||
package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
|
package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
|
||||||
|
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
|
import org.jetbrains.kotlin.fir.containingClass
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
|
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
|
||||||
import org.jetbrains.kotlin.idea.fir.findPsi
|
import org.jetbrains.kotlin.idea.fir.findPsi
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
|
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.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.KtSymbolByFirBuilder
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.KtFirMemberFunctionSymbolPointer
|
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.symbols.pointers.createSignature
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef
|
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.KtCommonSymbolModality
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolKind
|
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.CanNotCreateSymbolPointerForLocalLibraryDeclarationException
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtPsiBasedSymbolPointer
|
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.symbols.pointers.KtSymbolPointer
|
||||||
|
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
@@ -59,7 +60,7 @@ internal class KtFirFunctionSymbol(
|
|||||||
get() = firRef.withFir { fir ->
|
get() = firRef.withFir { fir ->
|
||||||
when {
|
when {
|
||||||
fir.isLocal -> KtSymbolKind.LOCAL
|
fir.isLocal -> KtSymbolKind.LOCAL
|
||||||
fir.symbol.callableId.classId == null -> KtSymbolKind.TOP_LEVEL
|
fir.containingClass()?.classId == null -> KtSymbolKind.TOP_LEVEL
|
||||||
else -> KtSymbolKind.MEMBER
|
else -> KtSymbolKind.MEMBER
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -70,7 +71,7 @@ internal class KtFirFunctionSymbol(
|
|||||||
return when (symbolKind) {
|
return when (symbolKind) {
|
||||||
KtSymbolKind.TOP_LEVEL -> TODO("Creating symbol for top level fun is not supported yet")
|
KtSymbolKind.TOP_LEVEL -> TODO("Creating symbol for top level fun is not supported yet")
|
||||||
KtSymbolKind.MEMBER -> KtFirMemberFunctionSymbolPointer(
|
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() }
|
firRef.withFir { it.createSignature() }
|
||||||
)
|
)
|
||||||
KtSymbolKind.NON_PROPERTY_PARAMETER -> error("KtFunction could not be a parameter")
|
KtSymbolKind.NON_PROPERTY_PARAMETER -> error("KtFunction could not be a parameter")
|
||||||
@@ -79,4 +80,4 @@ internal class KtFirFunctionSymbol(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-4
@@ -6,12 +6,12 @@
|
|||||||
package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
|
package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
|
||||||
|
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
|
import org.jetbrains.kotlin.fir.containingClass
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
import org.jetbrains.kotlin.idea.fir.findPsi
|
import org.jetbrains.kotlin.idea.fir.findPsi
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
|
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.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.KtSymbolByFirBuilder
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.KtFirMemberPropertySymbolPointer
|
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.KtFirMemberPropertySymbolPointer
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.createSignature
|
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.CanNotCreateSymbolPointerForLocalLibraryDeclarationException
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtPsiBasedSymbolPointer
|
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.symbols.pointers.KtSymbolPointer
|
||||||
|
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
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 isExtension: Boolean get() = firRef.withFir { it.receiverTypeRef != null }
|
||||||
override val symbolKind: KtSymbolKind
|
override val symbolKind: KtSymbolKind
|
||||||
get() = firRef.withFir { fir ->
|
get() = firRef.withFir { fir ->
|
||||||
when (fir.symbol.callableId.classId) {
|
when (fir.containingClass()?.classId) {
|
||||||
null -> KtSymbolKind.TOP_LEVEL
|
null -> KtSymbolKind.TOP_LEVEL
|
||||||
else -> KtSymbolKind.MEMBER
|
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.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.NON_PROPERTY_PARAMETER -> TODO("Creating symbol for top level parameters is not supported yet")
|
||||||
KtSymbolKind.MEMBER -> KtFirMemberPropertySymbolPointer(
|
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() }
|
firRef.withFir { it.createSignature() }
|
||||||
)
|
)
|
||||||
KtSymbolKind.LOCAL -> throw CanNotCreateSymbolPointerForLocalLibraryDeclarationException(name.asString())
|
KtSymbolKind.LOCAL -> throw CanNotCreateSymbolPointerForLocalLibraryDeclarationException(name.asString())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-2
@@ -5,9 +5,10 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.plugin
|
package org.jetbrains.kotlin.fir.plugin
|
||||||
|
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
|
||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
import org.jetbrains.kotlin.descriptors.Visibility
|
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.FirAnnotatedDeclaration
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
|
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
|
||||||
@@ -61,7 +62,7 @@ class AllOpenVisibilityTransformer(session: FirSession) : FirStatusTransformerEx
|
|||||||
} ?: return null
|
} ?: return null
|
||||||
val argument = annotation.arguments.firstOrNull() as? FirQualifiedAccessExpression ?: return null
|
val argument = annotation.arguments.firstOrNull() as? FirQualifiedAccessExpression ?: return null
|
||||||
val symbol = (argument.calleeReference as? FirResolvedNamedReference)?.resolvedSymbol as? FirVariableSymbol<*> ?: 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) {
|
return when (name) {
|
||||||
PublicName -> Visibilities.Public
|
PublicName -> Visibilities.Public
|
||||||
InternalName -> Visibilities.Internal
|
InternalName -> Visibilities.Internal
|
||||||
|
|||||||
Reference in New Issue
Block a user