FIR: Initialize dispatchReceiverType and containingClassAttr for callable members
This commit is contained in:
+11
-3
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||
import org.jetbrains.kotlin.fir.types.ConeAttributes
|
||||
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
|
||||
@@ -161,6 +162,8 @@ fun deserializeClassToSymbol(
|
||||
isStatic = true
|
||||
}
|
||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||
}.apply {
|
||||
containingClassAttr = context.dispatchReceiver!!.lookupTag
|
||||
}
|
||||
|
||||
property
|
||||
@@ -168,11 +171,15 @@ fun deserializeClassToSymbol(
|
||||
)
|
||||
|
||||
if (classKind == ClassKind.ENUM_CLASS) {
|
||||
generateValuesFunction(session, classId.packageFqName, classId.relativeClassName)
|
||||
generateValuesFunction(
|
||||
session,
|
||||
classId.packageFqName,
|
||||
classId.relativeClassName
|
||||
)
|
||||
generateValueOfFunction(session, classId.packageFqName, classId.relativeClassName)
|
||||
}
|
||||
|
||||
addCloneForArrayIfNeeded(classId)
|
||||
addCloneForArrayIfNeeded(classId, context.dispatchReceiver)
|
||||
addSerializableIfNeeded(classId)
|
||||
|
||||
declarations.sortWith(object : Comparator<FirDeclaration> {
|
||||
@@ -224,7 +231,7 @@ private fun FirRegularClassBuilder.addSerializableIfNeeded(classId: ClassId) {
|
||||
}
|
||||
}
|
||||
|
||||
private fun FirRegularClassBuilder.addCloneForArrayIfNeeded(classId: ClassId) {
|
||||
private fun FirRegularClassBuilder.addCloneForArrayIfNeeded(classId: ClassId, dispatchReceiver: ConeClassLikeType?) {
|
||||
if (classId.packageFqName != StandardNames.BUILT_INS_PACKAGE_FQ_NAME) return
|
||||
if (classId.shortClassName !in ARRAY_CLASSES) return
|
||||
superTypeRefs += buildResolvedTypeRef {
|
||||
@@ -259,5 +266,6 @@ private fun FirRegularClassBuilder.addCloneForArrayIfNeeded(classId: ClassId) {
|
||||
}
|
||||
name = CLONE
|
||||
symbol = FirNamedFunctionSymbol(CallableId(classId, CLONE))
|
||||
dispatchReceiverType = dispatchReceiver!!
|
||||
}
|
||||
}
|
||||
|
||||
+8
@@ -7,12 +7,14 @@ package org.jetbrains.kotlin.fir.deserialization
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.containingClassAttr
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.*
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.*
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.buildExpressionStub
|
||||
import org.jetbrains.kotlin.fir.resolve.defaultType
|
||||
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||
import org.jetbrains.kotlin.fir.symbols.StandardClassIds
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
@@ -64,6 +66,7 @@ class FirDeserializationContext(
|
||||
)
|
||||
|
||||
val memberDeserializer: FirMemberDeserializer = FirMemberDeserializer(this)
|
||||
val dispatchReceiver = relativeClassName?.let { ClassId(packageFqName, it, false).defaultType(allTypeParameters) }
|
||||
|
||||
companion object {
|
||||
fun createForPackage(
|
||||
@@ -225,6 +228,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
|
||||
isExternal = Flags.IS_EXTERNAL_ACCESSOR.get(getterFlags)
|
||||
}
|
||||
this.symbol = FirPropertyAccessorSymbol()
|
||||
dispatchReceiverType = c.dispatchReceiver
|
||||
}.apply {
|
||||
versionRequirementsTable = c.versionRequirementTable
|
||||
}
|
||||
@@ -256,6 +260,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
|
||||
isExternal = Flags.IS_EXTERNAL_ACCESSOR.get(setterFlags)
|
||||
}
|
||||
this.symbol = FirPropertyAccessorSymbol()
|
||||
dispatchReceiverType = c.dispatchReceiver
|
||||
valueParameters += local.memberDeserializer.valueParameters(
|
||||
listOf(proto.setterValueParameter),
|
||||
proto,
|
||||
@@ -288,6 +293,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
|
||||
name = callableName
|
||||
this.isVar = isVar
|
||||
this.symbol = symbol
|
||||
dispatchReceiverType = c.dispatchReceiver
|
||||
isLocal = false
|
||||
status = FirResolvedDeclarationStatusImpl(
|
||||
ProtoEnumFlags.visibility(Flags.VISIBILITY.get(flags)),
|
||||
@@ -365,6 +371,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
|
||||
isSuspend = Flags.IS_SUSPEND.get(flags)
|
||||
}
|
||||
this.symbol = symbol
|
||||
dispatchReceiverType = c.dispatchReceiver
|
||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||
typeParameters += local.typeDeserializer.ownTypeParameters.map { it.fir }
|
||||
valueParameters += local.memberDeserializer.valueParameters(
|
||||
@@ -443,6 +450,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
|
||||
annotations +=
|
||||
c.annotationDeserializer.loadConstructorAnnotations(c.containerSource, proto, local.nameResolver, local.typeTable)
|
||||
}.build().apply {
|
||||
containingClassAttr = c.dispatchReceiver!!.lookupTag
|
||||
versionRequirementsTable = c.versionRequirementTable
|
||||
}
|
||||
}
|
||||
|
||||
+2
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.fir.deserialization.FirBuiltinAnnotationDeserializer
|
||||
import org.jetbrains.kotlin.fir.deserialization.FirConstDeserializer
|
||||
import org.jetbrains.kotlin.fir.deserialization.FirDeserializationContext
|
||||
import org.jetbrains.kotlin.fir.deserialization.deserializeClassToSymbol
|
||||
import org.jetbrains.kotlin.fir.resolve.defaultType
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals
|
||||
import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider
|
||||
@@ -225,6 +226,7 @@ class FirBuiltinSymbolProvider(session: FirSession, val kotlinScopeProvider: Kot
|
||||
isVararg = false
|
||||
}
|
||||
}
|
||||
dispatchReceiverType = classId.defaultType(typeParameters.map { it.symbol })
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
+8
-3
@@ -11,18 +11,21 @@ import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.backend.FirMetadataSource
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.*
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildAnonymousFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildPropertyAccessor
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameterCopy
|
||||
import org.jetbrains.kotlin.fir.diagnostics.ConeIntermediateDiagnostic
|
||||
import org.jetbrains.kotlin.fir.typeContext
|
||||
import org.jetbrains.kotlin.fir.serialization.FirElementSerializer
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirDelegateFieldSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertyAccessorSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||
import org.jetbrains.kotlin.fir.typeContext
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||
import org.jetbrains.kotlin.ir.declarations.MetadataSource
|
||||
import org.jetbrains.kotlin.ir.util.*
|
||||
import org.jetbrains.kotlin.ir.util.getPackageFragment
|
||||
import org.jetbrains.kotlin.metadata.jvm.serialization.JvmStringTable
|
||||
import org.jetbrains.kotlin.protobuf.MessageLite
|
||||
import org.jetbrains.kotlin.types.AbstractTypeApproximator
|
||||
@@ -128,6 +131,8 @@ class FirMetadataSerializer(
|
||||
isVar = property.isVar
|
||||
isLocal = property.isLocal
|
||||
status = property.status
|
||||
dispatchReceiverType = property.dispatchReceiverType
|
||||
attributes = property.attributes.copy()
|
||||
annotations += property.annotations
|
||||
typeParameters += typeParameterSet
|
||||
}.apply {
|
||||
|
||||
+8
-2
@@ -6,7 +6,6 @@
|
||||
package org.jetbrains.kotlin.fir.backend.generators
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
|
||||
import org.jetbrains.kotlin.fir.backend.FirMetadataSource
|
||||
import org.jetbrains.kotlin.fir.backend.declareThisReceiverParameter
|
||||
@@ -17,8 +16,11 @@ import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
|
||||
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||
import org.jetbrains.kotlin.fir.types.ConeStarProjection
|
||||
import org.jetbrains.kotlin.fir.types.constructType
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirImplicitBooleanTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirImplicitIntTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirImplicitNullableAnyTypeRef
|
||||
@@ -35,7 +37,6 @@ import org.jetbrains.kotlin.ir.util.*
|
||||
import org.jetbrains.kotlin.ir.util.DataClassMembersGenerator
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||
|
||||
/**
|
||||
* A generator that generates synthetic members of data class as well as part of inline class.
|
||||
@@ -248,6 +249,11 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) {
|
||||
}
|
||||
)
|
||||
}
|
||||
dispatchReceiverType =
|
||||
ConeClassLikeLookupTagImpl(classId)
|
||||
.constructType(
|
||||
(1..irClass.typeParameters.size).map { ConeStarProjection }.toTypedArray(), isNullable = false
|
||||
)
|
||||
}
|
||||
val signature = if (classId.isLocal) null else components.signatureComposer.composeSignature(firFunction)
|
||||
return components.declarationStorage.declareIrSimpleFunction(signature, null) { symbol ->
|
||||
|
||||
+5
-1
@@ -10,13 +10,16 @@ import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirSymbolOwner
|
||||
import org.jetbrains.kotlin.fir.backend.*
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.dispatchReceiverClassOrNull
|
||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
import org.jetbrains.kotlin.fir.resolve.defaultType
|
||||
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
|
||||
import org.jetbrains.kotlin.fir.scopes.getDirectOverriddenFunctions
|
||||
import org.jetbrains.kotlin.fir.scopes.getDirectOverriddenProperties
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.FirFakeOverrideGenerator
|
||||
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
|
||||
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
||||
import org.jetbrains.kotlin.fir.symbols.PossiblyFirFakeOverrideSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||
@@ -30,7 +33,6 @@ import org.jetbrains.kotlin.ir.types.IrSimpleType
|
||||
import org.jetbrains.kotlin.ir.types.IrType
|
||||
import org.jetbrains.kotlin.ir.types.IrTypeProjection
|
||||
import org.jetbrains.kotlin.load.java.JavaDescriptorVisibilities
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
|
||||
class FakeOverrideGenerator(
|
||||
private val session: FirSession,
|
||||
@@ -87,6 +89,7 @@ class FakeOverrideGenerator(
|
||||
createFakeOverrideSymbol = { firFunction, callableSymbol ->
|
||||
FirFakeOverrideGenerator.createFakeOverrideFunction(
|
||||
session, firFunction, callableSymbol,
|
||||
newDispatchReceiverType = klass.defaultType(),
|
||||
derivedClassId = klass.symbol.classId,
|
||||
isExpect = (klass as? FirRegularClass)?.isExpect == true
|
||||
)
|
||||
@@ -110,6 +113,7 @@ class FakeOverrideGenerator(
|
||||
createFakeOverrideSymbol = { firProperty, callableSymbol ->
|
||||
FirFakeOverrideGenerator.createFakeOverrideProperty(
|
||||
session, firProperty, callableSymbol,
|
||||
newDispatchReceiverType = klass.defaultType(),
|
||||
derivedClassId = klass.symbol.classId,
|
||||
isExpect = (klass as? FirRegularClass)?.isExpect == true
|
||||
)
|
||||
|
||||
@@ -96,7 +96,7 @@ class JavaScopeProvider(
|
||||
val scope = buildJavaEnhancementScope(useSiteSession, symbol, scopeSession, visitedSymbols)
|
||||
visitedSymbols.remove(symbol)
|
||||
useSiteSuperType.wrapSubstitutionScopeIfNeed(
|
||||
useSiteSession, scope, symbol.fir, scopeSession, regularClass.classId
|
||||
useSiteSession, scope, symbol.fir, scopeSession, derivedClass = regularClass
|
||||
)
|
||||
} else {
|
||||
null
|
||||
@@ -112,7 +112,7 @@ class JavaScopeProvider(
|
||||
else JavaTypeParameterStack.EMPTY
|
||||
),
|
||||
superTypeEnhancementScopes,
|
||||
regularClass.classId,
|
||||
regularClass.defaultType(),
|
||||
), wrappedDeclaredScope
|
||||
)
|
||||
}
|
||||
|
||||
@@ -19,12 +19,14 @@ import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.*
|
||||
import org.jetbrains.kotlin.fir.java.declarations.*
|
||||
import org.jetbrains.kotlin.fir.resolve.constructType
|
||||
import org.jetbrains.kotlin.fir.resolve.defaultType
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.SymbolProviderCache
|
||||
import org.jetbrains.kotlin.fir.resolve.scopes.wrapScopeWithJvmMapped
|
||||
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||
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.builder.buildResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
|
||||
@@ -187,6 +189,9 @@ class JavaSymbolProvider(
|
||||
buildOuterClassTypeParameterRef { symbol = it.symbol }
|
||||
}
|
||||
}
|
||||
|
||||
val dispatchReceiver = classId.defaultType(typeParameters.map { it.symbol } )
|
||||
|
||||
status = FirResolvedDeclarationStatusImpl(
|
||||
javaClass.visibility,
|
||||
javaClass.modality
|
||||
@@ -200,7 +205,7 @@ class JavaSymbolProvider(
|
||||
// TODO: may be we can process fields & methods later.
|
||||
// However, they should be built up to override resolve stage
|
||||
for (javaField in javaClass.fields) {
|
||||
declarations += convertJavaFieldToFir(javaField, classId, javaTypeParameterStack)
|
||||
declarations += convertJavaFieldToFir(javaField, classId, javaTypeParameterStack, dispatchReceiver)
|
||||
}
|
||||
val valueParametersForAnnotationConstructor = ValueParametersForAnnotationConstructor()
|
||||
val classIsAnnotation = classKind == ClassKind.ANNOTATION_CLASS
|
||||
@@ -212,7 +217,8 @@ class JavaSymbolProvider(
|
||||
classId,
|
||||
javaTypeParameterStack,
|
||||
classIsAnnotation,
|
||||
valueParametersForAnnotationConstructor
|
||||
valueParametersForAnnotationConstructor,
|
||||
dispatchReceiver
|
||||
)
|
||||
}
|
||||
val javaClassDeclaredConstructors = javaClass.constructors
|
||||
@@ -243,11 +249,16 @@ class JavaSymbolProvider(
|
||||
}
|
||||
|
||||
if (classKind == ClassKind.ENUM_CLASS) {
|
||||
generateValuesFunction(session, classId.packageFqName, classId.relativeClassName)
|
||||
generateValuesFunction(
|
||||
session,
|
||||
classId.packageFqName,
|
||||
classId.relativeClassName
|
||||
)
|
||||
generateValueOfFunction(session, classId.packageFqName, classId.relativeClassName)
|
||||
}
|
||||
if (classIsAnnotation) {
|
||||
declarations += buildConstructorForAnnotationClass(constructorId, this, valueParametersForAnnotationConstructor)
|
||||
declarations +=
|
||||
buildConstructorForAnnotationClass(constructorId, this, valueParametersForAnnotationConstructor)
|
||||
}
|
||||
parentClassTypeParameterStackCache.remove(classSymbol)
|
||||
}
|
||||
@@ -265,7 +276,8 @@ class JavaSymbolProvider(
|
||||
private fun convertJavaFieldToFir(
|
||||
javaField: JavaField,
|
||||
classId: ClassId,
|
||||
javaTypeParameterStack: JavaTypeParameterStack
|
||||
javaTypeParameterStack: JavaTypeParameterStack,
|
||||
dispatchReceiver: ConeClassLikeType
|
||||
): FirDeclaration {
|
||||
val fieldName = javaField.name
|
||||
val fieldId = CallableId(classId.packageFqName, classId.relativeClassName, fieldName)
|
||||
@@ -289,6 +301,8 @@ class JavaSymbolProvider(
|
||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||
origin = FirDeclarationOrigin.Java
|
||||
addAnnotationsFrom(this@JavaSymbolProvider.session, javaField, javaTypeParameterStack)
|
||||
}.apply {
|
||||
containingClassAttr = ConeClassLikeLookupTagImpl(classId)
|
||||
}
|
||||
else -> buildJavaField {
|
||||
source = (javaField as? JavaElementImpl<*>)?.psi?.toFirPsiSourceElement()
|
||||
@@ -311,6 +325,14 @@ class JavaSymbolProvider(
|
||||
isStatic = javaField.isStatic
|
||||
addAnnotationsFrom(this@JavaSymbolProvider.session, javaField, javaTypeParameterStack)
|
||||
initializer = convertJavaInitializerToFir(javaField.initializerValue)
|
||||
|
||||
if (!javaField.isStatic) {
|
||||
dispatchReceiverType = dispatchReceiver
|
||||
}
|
||||
}.apply {
|
||||
if (javaField.isStatic) {
|
||||
containingClassAttr = ConeClassLikeLookupTagImpl(classId)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -325,7 +347,8 @@ class JavaSymbolProvider(
|
||||
classId: ClassId,
|
||||
javaTypeParameterStack: JavaTypeParameterStack,
|
||||
classIsAnnotation: Boolean,
|
||||
valueParametersForAnnotationConstructor: ValueParametersForAnnotationConstructor
|
||||
valueParametersForAnnotationConstructor: ValueParametersForAnnotationConstructor,
|
||||
dispatchReceiver: ConeClassLikeType
|
||||
): FirJavaMethod {
|
||||
val methodName = javaMethod.name
|
||||
val methodId = CallableId(classId.packageFqName, classId.relativeClassName, methodName)
|
||||
@@ -364,6 +387,14 @@ class JavaSymbolProvider(
|
||||
isExternal = false
|
||||
isSuspend = false
|
||||
}
|
||||
|
||||
if (!javaMethod.isStatic) {
|
||||
dispatchReceiverType = dispatchReceiver
|
||||
}
|
||||
}.apply {
|
||||
if (javaMethod.isStatic) {
|
||||
containingClassAttr = ConeClassLikeLookupTagImpl(classId)
|
||||
}
|
||||
}
|
||||
if (classIsAnnotation) {
|
||||
val parameterForAnnotationConstructor = buildJavaValueParameter {
|
||||
@@ -425,6 +456,8 @@ class JavaSymbolProvider(
|
||||
)
|
||||
}
|
||||
}
|
||||
}.apply {
|
||||
containingClassAttr = ownerClassBuilder.symbol.toLookupTag()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -445,6 +478,8 @@ class JavaSymbolProvider(
|
||||
visibility = Visibilities.Public
|
||||
isInner = false
|
||||
isPrimary = true
|
||||
}.apply {
|
||||
containingClassAttr = ownerClassBuilder.symbol.toLookupTag()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+5
-2
@@ -5,10 +5,10 @@
|
||||
|
||||
package org.jetbrains.kotlin.fir.java.declarations
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.FirImplementationDetail
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirConstructorBuilder
|
||||
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.expressions.FirBlock
|
||||
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
|
||||
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
|
||||
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||
import org.jetbrains.kotlin.fir.visitors.FirVisitor
|
||||
@@ -37,6 +38,7 @@ class FirJavaConstructor @FirImplementationDetail constructor(
|
||||
override val annotations: MutableList<FirAnnotationCall>,
|
||||
override var status: FirDeclarationStatus,
|
||||
override var resolvePhase: FirResolvePhase,
|
||||
override val dispatchReceiverType: ConeKotlinType?,
|
||||
) : FirConstructor() {
|
||||
override val receiverTypeRef: FirTypeRef? get() = null
|
||||
|
||||
@@ -154,7 +156,8 @@ class FirJavaConstructorBuilder : FirConstructorBuilder() {
|
||||
typeParameters,
|
||||
annotations,
|
||||
status,
|
||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES,
|
||||
dispatchReceiverType
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -6,10 +6,10 @@
|
||||
package org.jetbrains.kotlin.fir.java.declarations
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.FirImplementationDetail
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirFieldBuilder
|
||||
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirDelegateFieldSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFieldSymbol
|
||||
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||
import org.jetbrains.kotlin.fir.visitors.FirVisitor
|
||||
@@ -42,6 +43,8 @@ class FirJavaField @FirImplementationDetail constructor(
|
||||
override val annotations: MutableList<FirAnnotationCall>,
|
||||
override val typeParameters: MutableList<FirTypeParameter>,
|
||||
override var initializer: FirExpression?,
|
||||
override val dispatchReceiverType: ConeKotlinType?,
|
||||
override val attributes: FirDeclarationAttributes,
|
||||
) : FirField() {
|
||||
init {
|
||||
symbol.bind(this)
|
||||
@@ -55,8 +58,6 @@ class FirJavaField @FirImplementationDetail constructor(
|
||||
override val origin: FirDeclarationOrigin
|
||||
get() = FirDeclarationOrigin.Java
|
||||
|
||||
override val attributes: FirDeclarationAttributes = FirDeclarationAttributes()
|
||||
|
||||
override fun <D> transformReturnTypeRef(transformer: FirTransformer<D>, data: D): FirField {
|
||||
returnTypeRef = returnTypeRef.transformSingle(transformer, data)
|
||||
return this
|
||||
@@ -163,6 +164,8 @@ internal class FirJavaFieldBuilder : FirFieldBuilder() {
|
||||
annotations,
|
||||
typeParameters,
|
||||
initializer,
|
||||
dispatchReceiverType,
|
||||
attributes,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -6,10 +6,10 @@
|
||||
package org.jetbrains.kotlin.fir.java.declarations
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.FirImplementationDetail
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||
import org.jetbrains.kotlin.fir.contracts.impl.FirEmptyContractDescription
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirSimpleFunctionImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirBlock
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.jvm.FirJavaTypeRef
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
@@ -53,6 +54,7 @@ class FirJavaMethod @FirImplementationDetail constructor(
|
||||
containerSource: DeserializedContainerSource?,
|
||||
symbol: FirFunctionSymbol<FirSimpleFunction>,
|
||||
annotations: MutableList<FirAnnotationCall>,
|
||||
dispatchReceiverType: ConeKotlinType?,
|
||||
) : FirSimpleFunctionImpl(
|
||||
source,
|
||||
session,
|
||||
@@ -65,6 +67,7 @@ class FirJavaMethod @FirImplementationDetail constructor(
|
||||
body,
|
||||
status,
|
||||
containerSource,
|
||||
dispatchReceiverType = dispatchReceiverType,
|
||||
contractDescription = FirEmptyContractDescription,
|
||||
name,
|
||||
symbol,
|
||||
@@ -107,6 +110,7 @@ class FirJavaMethodBuilder : FirSimpleFunctionBuilder() {
|
||||
containerSource,
|
||||
symbol,
|
||||
annotations,
|
||||
dispatchReceiverType,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
+11
-1
@@ -95,14 +95,18 @@ class FirSignatureEnhancement(
|
||||
session = this@FirSignatureEnhancement.session
|
||||
this.symbol = symbol
|
||||
this.name = name
|
||||
returnTypeRef = newReturnTypeRef
|
||||
|
||||
// TODO: Use some kind of copy mechanism
|
||||
visibility = firElement.visibility
|
||||
modality = firElement.modality
|
||||
returnTypeRef = newReturnTypeRef
|
||||
isVar = firElement.isVar
|
||||
isStatic = firElement.isStatic
|
||||
annotations += firElement.annotations
|
||||
status = firElement.status
|
||||
initializer = firElement.initializer
|
||||
dispatchReceiverType = firElement.dispatchReceiverType
|
||||
attributes = firElement.attributes.copy()
|
||||
}
|
||||
return symbol
|
||||
}
|
||||
@@ -221,12 +225,16 @@ class FirSignatureEnhancement(
|
||||
isInner = firMethod.isInner
|
||||
}
|
||||
this.symbol = symbol
|
||||
dispatchReceiverType = firMethod.dispatchReceiverType
|
||||
attributes = firMethod.attributes.copy()
|
||||
}
|
||||
} else {
|
||||
FirConstructorBuilder().apply {
|
||||
returnTypeRef = newReturnTypeRef
|
||||
status = firMethod.status
|
||||
this.symbol = symbol
|
||||
dispatchReceiverType = firMethod.dispatchReceiverType
|
||||
attributes = firMethod.attributes.copy()
|
||||
}
|
||||
}.apply {
|
||||
source = firMethod.source
|
||||
@@ -250,6 +258,8 @@ class FirSignatureEnhancement(
|
||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||
valueParameters += newValueParameters
|
||||
typeParameters += firMethod.typeParameters
|
||||
dispatchReceiverType = firMethod.dispatchReceiverType
|
||||
attributes = firMethod.attributes.copy()
|
||||
}
|
||||
}
|
||||
else -> throw AssertionError("Unknown Java method to enhance: ${firMethod.render()}")
|
||||
|
||||
+2
-1
@@ -104,7 +104,8 @@ class JavaClassMembersEnhancementScope(
|
||||
FirDeclarationOrigin.Enhancement,
|
||||
newParameterTypes = valueParameters.zip(newParameterTypes).map { (valueParameter, newType) ->
|
||||
newType ?: valueParameter.returnTypeRef.coneType
|
||||
}
|
||||
},
|
||||
newDispatchReceiverType = dispatchReceiverType,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,7 +46,10 @@ fun wrapScopeWithJvmMapped(
|
||||
(klass.symbol.constructType(
|
||||
klass.typeParameters.map { ConeTypeParameterTypeImpl(it.symbol.toLookupTag(), false) }.toTypedArray(),
|
||||
false
|
||||
) as ConeClassLikeType).wrapSubstitutionScopeIfNeed(useSiteSession, jvmMappedScope, klass, scopeSession, klass.classId)
|
||||
) as ConeClassLikeType).wrapSubstitutionScopeIfNeed(
|
||||
useSiteSession, jvmMappedScope, klass, scopeSession,
|
||||
derivedClass = klass,
|
||||
)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
+20
-4
@@ -415,7 +415,7 @@ class DeclarationsConverter(
|
||||
addCapturedTypeParameters(firTypeParameters)
|
||||
|
||||
val selfType = classNode.toDelegatedSelfType(this)
|
||||
|
||||
registerSelfType(selfType)
|
||||
|
||||
val delegationSpecifiers = superTypeList?.let { convertDelegationSpecifiers(it, symbol, selfType) }
|
||||
var delegatedSuperTypeRef: FirTypeRef? = delegationSpecifiers?.delegatedSuperTypeRef
|
||||
@@ -500,8 +500,18 @@ class DeclarationsConverter(
|
||||
}
|
||||
|
||||
if (modifiers.isEnum()) {
|
||||
generateValuesFunction(baseSession, context.packageFqName, context.className, modifiers.hasExpect())
|
||||
generateValueOfFunction(baseSession, context.packageFqName, context.className, modifiers.hasExpect())
|
||||
generateValuesFunction(
|
||||
baseSession,
|
||||
context.packageFqName,
|
||||
context.className,
|
||||
modifiers.hasExpect()
|
||||
)
|
||||
generateValueOfFunction(
|
||||
baseSession,
|
||||
context.packageFqName,
|
||||
context.className,
|
||||
modifiers.hasExpect()
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -523,6 +533,7 @@ class DeclarationsConverter(
|
||||
symbol = FirAnonymousObjectSymbol()
|
||||
typeParameters += context.capturedTypeParameters.map { buildOuterClassTypeParameterRef { this.symbol = it } }
|
||||
val delegatedSelfType = objectLiteral.toDelegatedSelfType(this)
|
||||
registerSelfType(delegatedSelfType)
|
||||
|
||||
var modifiers = Modifier()
|
||||
var primaryConstructor: LighterASTNode? = null
|
||||
@@ -637,7 +648,7 @@ class DeclarationsConverter(
|
||||
emptyArray(),
|
||||
isNullable = false
|
||||
)
|
||||
},
|
||||
}.also { registerSelfType(it) },
|
||||
delegatedSuperTypeRef = classWrapper.delegatedSelfTypeRef,
|
||||
superTypeCallEntry = enumSuperTypeCallEntry
|
||||
)
|
||||
@@ -743,6 +754,8 @@ class DeclarationsConverter(
|
||||
this.valueParameters += valueParameters.map { it.firValueParameter }
|
||||
delegatedConstructor = firDelegatedCall
|
||||
this.body = body
|
||||
}.apply {
|
||||
containingClassAttr = currentDispatchReceiverType()!!.lookupTag
|
||||
}, valueParameters
|
||||
)
|
||||
}
|
||||
@@ -814,6 +827,7 @@ class DeclarationsConverter(
|
||||
this.body = body
|
||||
context.firFunctionTargets.removeLast()
|
||||
}.also {
|
||||
it.containingClassAttr = currentDispatchReceiverType()!!.lookupTag
|
||||
target.bind(it)
|
||||
}
|
||||
}
|
||||
@@ -969,6 +983,7 @@ class DeclarationsConverter(
|
||||
this.isLocal = false
|
||||
receiverTypeRef = receiverType
|
||||
symbol = FirPropertySymbol(callableIdForName(propertyName))
|
||||
dispatchReceiverType = currentDispatchReceiverType()
|
||||
withCapturedTypeParameters {
|
||||
typeParameters += firTypeParameters
|
||||
addCapturedTypeParameters(firTypeParameters)
|
||||
@@ -1292,6 +1307,7 @@ class DeclarationsConverter(
|
||||
}
|
||||
|
||||
symbol = FirNamedFunctionSymbol(callableIdForName(functionName, isLocal))
|
||||
dispatchReceiverType = currentDispatchReceiverType()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -25,7 +25,6 @@ import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
|
||||
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
|
||||
import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.*
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirExpressionStub
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirSingleExpressionBlock
|
||||
import org.jetbrains.kotlin.fir.references.builder.*
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
|
||||
@@ -462,6 +461,8 @@ class RawFirBuilder(
|
||||
visibility
|
||||
) else null
|
||||
extractAnnotationsTo(this)
|
||||
|
||||
dispatchReceiverType = currentDispatchReceiverType()
|
||||
}.apply {
|
||||
isFromVararg = firParameter.isVararg
|
||||
}
|
||||
@@ -687,6 +688,8 @@ class RawFirBuilder(
|
||||
this@toFirConstructor?.extractAnnotationsTo(this)
|
||||
this@toFirConstructor?.extractValueParametersTo(this)
|
||||
this.body = body
|
||||
}.apply {
|
||||
containingClassAttr = currentDispatchReceiverType()!!.lookupTag
|
||||
}
|
||||
}
|
||||
|
||||
@@ -750,6 +753,8 @@ class RawFirBuilder(
|
||||
val delegatedEntrySelfType = buildResolvedTypeRef {
|
||||
type = ConeClassLikeTypeImpl(this@buildAnonymousObject.symbol.toLookupTag(), emptyArray(), isNullable = false)
|
||||
}
|
||||
registerSelfType(delegatedEntrySelfType)
|
||||
|
||||
superTypeRefs += delegatedEnumSelfTypeRef
|
||||
val superTypeCallEntry = superTypeListEntries.firstIsInstanceOrNull<KtSuperTypeCallEntry>()
|
||||
val correctedEnumSelfTypeRef = buildResolvedTypeRef {
|
||||
@@ -777,6 +782,8 @@ class RawFirBuilder(
|
||||
}
|
||||
}
|
||||
}
|
||||
}.apply {
|
||||
containingClassAttr = currentDispatchReceiverType()!!.lookupTag
|
||||
}
|
||||
}
|
||||
|
||||
@@ -827,6 +834,8 @@ class RawFirBuilder(
|
||||
addCapturedTypeParameters(typeParameters.take(classOrObject.typeParameters.size))
|
||||
|
||||
val delegatedSelfType = classOrObject.toDelegatedSelfType(this)
|
||||
registerSelfType(delegatedSelfType)
|
||||
|
||||
val delegatedSuperType = classOrObject.extractSuperTypeListEntriesTo(
|
||||
this,
|
||||
delegatedSelfType,
|
||||
@@ -884,10 +893,14 @@ class RawFirBuilder(
|
||||
|
||||
if (classOrObject.hasModifier(ENUM_KEYWORD)) {
|
||||
generateValuesFunction(
|
||||
baseSession, context.packageFqName, context.className, classOrObject.hasExpectModifier()
|
||||
baseSession,
|
||||
context.packageFqName,
|
||||
context.className,
|
||||
classOrObject.hasExpectModifier()
|
||||
)
|
||||
generateValueOfFunction(
|
||||
baseSession, context.packageFqName, context.className, classOrObject.hasExpectModifier()
|
||||
baseSession, context.packageFqName, context.className,
|
||||
classOrObject.hasExpectModifier()
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -907,6 +920,7 @@ class RawFirBuilder(
|
||||
symbol = FirAnonymousObjectSymbol()
|
||||
typeParameters += context.capturedTypeParameters.map { buildOuterClassTypeParameterRef { symbol = it } }
|
||||
val delegatedSelfType = objectDeclaration.toDelegatedSelfType(this)
|
||||
registerSelfType(delegatedSelfType)
|
||||
objectDeclaration.extractAnnotationsTo(this)
|
||||
val delegatedSuperType = objectDeclaration.extractSuperTypeListEntriesTo(
|
||||
this,
|
||||
@@ -975,6 +989,7 @@ class RawFirBuilder(
|
||||
name = function.nameAsSafeName
|
||||
labelName = runIf(!name.isSpecial) { name.identifier }
|
||||
symbol = FirNamedFunctionSymbol(callableIdForName(function.nameAsSafeName, function.isLocal))
|
||||
dispatchReceiverType = currentDispatchReceiverType()
|
||||
status = FirDeclarationStatusImpl(
|
||||
if (function.isLocal) Visibilities.Local else function.visibility,
|
||||
function.modality,
|
||||
@@ -1170,6 +1185,7 @@ class RawFirBuilder(
|
||||
this.body = body
|
||||
this@RawFirBuilder.context.firFunctionTargets.removeLast()
|
||||
}.also {
|
||||
it.containingClassAttr = currentDispatchReceiverType()!!.lookupTag
|
||||
target.bind(it)
|
||||
}
|
||||
}
|
||||
@@ -1244,6 +1260,7 @@ class RawFirBuilder(
|
||||
isLocal = false
|
||||
receiverTypeRef = receiverTypeReference.convertSafe()
|
||||
symbol = FirPropertySymbol(callableIdForName(propertyName))
|
||||
dispatchReceiverType = currentDispatchReceiverType()
|
||||
extractTypeParametersTo(this)
|
||||
withCapturedTypeParameters {
|
||||
addCapturedTypeParameters(this.typeParameters)
|
||||
|
||||
+18
-1
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.fir.references.builder.*
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirSimpleNamedReference
|
||||
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
||||
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
@@ -66,14 +67,27 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
|
||||
): T {
|
||||
context.className = context.className.child(name)
|
||||
context.localBits.add(isLocal)
|
||||
val dispatchReceiversNumber = context.dispatchReceiverTypesStack.size
|
||||
return try {
|
||||
l()
|
||||
} finally {
|
||||
require(context.dispatchReceiverTypesStack.size <= dispatchReceiversNumber + 1) {
|
||||
"Wrong number of ${context.dispatchReceiverTypesStack.size}"
|
||||
}
|
||||
|
||||
if (context.dispatchReceiverTypesStack.size > dispatchReceiversNumber) {
|
||||
context.dispatchReceiverTypesStack.removeAt(context.dispatchReceiverTypesStack.lastIndex)
|
||||
}
|
||||
|
||||
context.className = context.className.parent()
|
||||
context.localBits.removeLast()
|
||||
}
|
||||
}
|
||||
|
||||
fun registerSelfType(selfType: FirResolvedTypeRef) {
|
||||
context.dispatchReceiverTypesStack.add(selfType.type as ConeClassLikeType)
|
||||
}
|
||||
|
||||
inline fun <T> withCapturedTypeParameters(block: () -> T): T {
|
||||
val previous = context.capturedTypeParameters
|
||||
val result = block()
|
||||
@@ -109,6 +123,8 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
|
||||
else -> CallableId(context.packageFqName, context.className, name)
|
||||
}
|
||||
|
||||
fun currentDispatchReceiverType(): ConeClassLikeType? = context.dispatchReceiverTypesStack.lastOrNull()
|
||||
|
||||
fun callableIdForClassConstructor() =
|
||||
if (context.className == FqName.ROOT) CallableId(context.packageFqName, Name.special("<anonymous-init>"))
|
||||
else CallableId(context.packageFqName, context.className, context.className.shortName())
|
||||
@@ -1067,7 +1083,7 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
|
||||
this.name = name
|
||||
status = FirDeclarationStatusImpl(Visibilities.Public, Modality.FINAL)
|
||||
symbol = FirNamedFunctionSymbol(CallableId(packageFqName, classFqName, name))
|
||||
|
||||
dispatchReceiverType = currentDispatchReceiverType()
|
||||
// Refer to FIR backend ClassMemberGenerator for body generation.
|
||||
}
|
||||
classBuilder.addDeclaration(componentFunction)
|
||||
@@ -1087,6 +1103,7 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
|
||||
name = copyName
|
||||
status = FirDeclarationStatusImpl(Visibilities.Public, Modality.FINAL)
|
||||
symbol = FirNamedFunctionSymbol(CallableId(packageFqName, classFqName, copyName))
|
||||
dispatchReceiverType = currentDispatchReceiverType()
|
||||
for ((ktParameter, firProperty) in zippedParameters) {
|
||||
val propertyName = firProperty.name
|
||||
val parameterSource = ktParameter?.toFirSourceElement(FirFakeSourceElementKind.DataClassGeneratedMembers)
|
||||
|
||||
@@ -6,9 +6,14 @@
|
||||
package org.jetbrains.kotlin.fir.builder
|
||||
|
||||
import kotlinx.collections.immutable.persistentListOf
|
||||
import org.jetbrains.kotlin.fir.*
|
||||
import org.jetbrains.kotlin.fir.FirFunctionTarget
|
||||
import org.jetbrains.kotlin.fir.FirLabel
|
||||
import org.jetbrains.kotlin.fir.FirLoopTarget
|
||||
import org.jetbrains.kotlin.fir.FirSourceElementKind
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
||||
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
@@ -27,4 +32,5 @@ class Context<T> {
|
||||
val arraySetArgument = mutableMapOf<T, FirExpression>()
|
||||
|
||||
var forcedElementSourceKind: FirSourceElementKind? = null
|
||||
val dispatchReceiverTypesStack = mutableListOf<ConeClassLikeType>()
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.resolve
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.containingClassAttr
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirTypeParameterBuilder
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunction
|
||||
@@ -44,6 +45,7 @@ val SAM_PARAMETER_NAME = Name.identifier("block")
|
||||
class FirSamResolverImpl(
|
||||
private val firSession: FirSession,
|
||||
private val scopeSession: ScopeSession,
|
||||
private val outerClassManager: FirOuterClassManager,
|
||||
) : FirSamResolver() {
|
||||
|
||||
private val resolvedFunctionType: MutableMap<FirRegularClass, Any> = mutableMapOf()
|
||||
@@ -197,6 +199,8 @@ class FirSamResolverImpl(
|
||||
}
|
||||
|
||||
resolvePhase = FirResolvePhase.BODY_RESOLVE
|
||||
}.apply {
|
||||
containingClassAttr = outerClassManager.outerClass(firRegularClass.symbol)?.toLookupTag()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -18,11 +18,13 @@ import org.jetbrains.kotlin.fir.scopes.impl.FirScopeWithFakeOverrideTypeCalculat
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.FirStandardOverrideChecker
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.FirTypeIntersectionScope
|
||||
import org.jetbrains.kotlin.fir.scopes.scopeForClass
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.fir.typeContext
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
|
||||
fun ConeKotlinType.scope(
|
||||
useSiteSession: FirSession,
|
||||
@@ -64,7 +66,8 @@ private fun ConeKotlinType.scope(useSiteSession: FirSession, scopeSession: Scope
|
||||
FirStandardOverrideChecker(useSiteSession),
|
||||
intersectedTypes.mapNotNullTo(mutableListOf()) {
|
||||
it.scope(useSiteSession, scopeSession, requiredPhase)
|
||||
}
|
||||
},
|
||||
type
|
||||
)
|
||||
is ConeDefinitelyNotNullType -> original.scope(useSiteSession, scopeSession, requiredPhase)
|
||||
is ConeIntegerLiteralType -> error("ILT should not be in receiver position")
|
||||
@@ -72,6 +75,14 @@ private fun ConeKotlinType.scope(useSiteSession: FirSession, scopeSession: Scope
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fun FirClass<*>.defaultType(): ConeClassLikeType =
|
||||
when (this) {
|
||||
is FirRegularClass -> defaultType()
|
||||
is FirAnonymousObject -> defaultType()
|
||||
else -> error("Unknown class ${this::class}")
|
||||
}
|
||||
|
||||
fun FirRegularClass.defaultType(): ConeClassLikeTypeImpl {
|
||||
return ConeClassLikeTypeImpl(
|
||||
symbol.toLookupTag(),
|
||||
@@ -93,4 +104,16 @@ fun FirAnonymousObject.defaultType(): ConeClassLikeType {
|
||||
)
|
||||
}
|
||||
|
||||
fun ClassId.defaultType(parameters: List<FirTypeParameterSymbol>): ConeClassLikeType =
|
||||
ConeClassLikeTypeImpl(
|
||||
ConeClassLikeLookupTagImpl(this),
|
||||
parameters.map {
|
||||
ConeTypeParameterTypeImpl(
|
||||
it.toLookupTag(),
|
||||
isNullable = false
|
||||
)
|
||||
}.toTypedArray(),
|
||||
isNullable = false,
|
||||
)
|
||||
|
||||
val TYPE_PARAMETER_SCOPE_KEY = scopeSessionKey<FirTypeParameterSymbol, FirTypeScope>()
|
||||
|
||||
@@ -16,7 +16,6 @@ import org.jetbrains.kotlin.fir.scopes.impl.FirClassSubstitutionScope
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.typeContext
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.types.model.CaptureStatus
|
||||
|
||||
abstract class SupertypeSupplier {
|
||||
@@ -91,7 +90,7 @@ fun ConeClassLikeType.wrapSubstitutionScopeIfNeed(
|
||||
useSiteMemberScope: FirTypeScope,
|
||||
declaration: FirClassLikeDeclaration<*>,
|
||||
builder: ScopeSession,
|
||||
derivedClassId: ClassId?
|
||||
derivedClass: FirRegularClass
|
||||
): FirTypeScope {
|
||||
if (this.typeArguments.isEmpty()) return useSiteMemberScope
|
||||
return builder.getOrBuild(declaration.symbol, SubstitutionScopeKey(this)) {
|
||||
@@ -110,7 +109,8 @@ fun ConeClassLikeType.wrapSubstitutionScopeIfNeed(
|
||||
}
|
||||
FirClassSubstitutionScope(
|
||||
session, useSiteMemberScope, substitutor,
|
||||
skipPrivateMembers = true, derivedClassId = derivedClassId
|
||||
dispatchReceiverTypeForSubstitutedMembers = derivedClass.defaultType(),
|
||||
skipPrivateMembers = true,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
+6
-2
@@ -124,8 +124,11 @@ private fun FirTypeAliasSymbol.findSAMConstructorForTypeAlias(
|
||||
session
|
||||
) { newReturnType, newParameterTypes, newTypeParameters ->
|
||||
FirFakeOverrideGenerator.createFakeOverrideFunction(
|
||||
session, this, namedSymbol, null,
|
||||
newReturnType, newParameterTypes, newTypeParameters
|
||||
session, this, namedSymbol,
|
||||
newDispatchReceiverType = null,
|
||||
newReceiverType = null,
|
||||
newReturnType, newParameterTypes, newTypeParameters,
|
||||
expansionRegularClass.classId,
|
||||
).fir
|
||||
} ?: return null
|
||||
|
||||
@@ -263,6 +266,7 @@ private fun prepareSubstitutingScopeForTypeAliasConstructors(
|
||||
valueParameters += this@factory.valueParameters
|
||||
}
|
||||
this.typeParameters += newTypeParameters
|
||||
this.attributes = this@factory.attributes.copy()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+4
-1
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildRegularClass
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.resolve.constructType
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
|
||||
@@ -47,6 +48,7 @@ class FirCloneableSymbolProvider(session: FirSession, scopeProvider: FirScopePro
|
||||
Modality.ABSTRACT
|
||||
)
|
||||
classKind = ClassKind.INTERFACE
|
||||
symbol = FirRegularClassSymbol(CLONEABLE_CLASS_ID)
|
||||
declarations += buildSimpleFunction {
|
||||
this.session = session
|
||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||
@@ -57,10 +59,11 @@ class FirCloneableSymbolProvider(session: FirSession, scopeProvider: FirScopePro
|
||||
status = FirDeclarationStatusImpl(Visibilities.Protected, Modality.OPEN)
|
||||
name = CLONE
|
||||
symbol = FirNamedFunctionSymbol(CallableId(CLONEABLE_CLASS_ID, CLONE))
|
||||
dispatchReceiverType = this@buildRegularClass.symbol.constructType(emptyArray(), isNullable = false)
|
||||
}
|
||||
this.scopeProvider = scopeProvider
|
||||
name = CLONEABLE
|
||||
symbol = FirRegularClassSymbol(CLONEABLE_CLASS_ID)
|
||||
|
||||
}
|
||||
|
||||
override fun getClassLikeSymbolByFqName(classId: ClassId): FirClassLikeSymbol<*>? {
|
||||
|
||||
+2
-1
@@ -122,7 +122,7 @@ abstract class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAb
|
||||
override val symbolProvider: FirSymbolProvider = session.firSymbolProvider
|
||||
|
||||
override val resolutionStageRunner: ResolutionStageRunner = ResolutionStageRunner()
|
||||
override val samResolver: FirSamResolver = FirSamResolverImpl(session, scopeSession)
|
||||
|
||||
private val qualifiedResolver: FirQualifiedNameResolver = FirQualifiedNameResolver(this)
|
||||
override val callResolver: FirCallResolver = FirCallResolver(
|
||||
this,
|
||||
@@ -137,5 +137,6 @@ abstract class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAb
|
||||
override val syntheticCallGenerator: FirSyntheticCallGenerator = FirSyntheticCallGenerator(this)
|
||||
override val doubleColonExpressionResolver: FirDoubleColonExpressionResolver = FirDoubleColonExpressionResolver(session)
|
||||
override val outerClassManager: FirOuterClassManager = FirOuterClassManager(session, context.outerLocalClassForNested)
|
||||
override val samResolver: FirSamResolver = FirSamResolverImpl(session, scopeSession, outerClassManager)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,6 @@ import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
|
||||
import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.*
|
||||
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||
import org.jetbrains.kotlin.fir.types.ConeClassErrorType
|
||||
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
||||
@@ -60,9 +59,9 @@ class KotlinScopeProvider(
|
||||
useSiteSession,
|
||||
FirTypeIntersectionScope.prepareIntersectionScope(
|
||||
useSiteSession, FirStandardOverrideChecker(useSiteSession), scopes,
|
||||
klass.classId,
|
||||
klass.defaultType(),
|
||||
),
|
||||
decoratedDeclaredMemberScope
|
||||
decoratedDeclaredMemberScope,
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -113,7 +112,7 @@ fun FirClass<*>.scopeForClass(
|
||||
): FirTypeScope = scopeForClassImpl(
|
||||
substitutor, useSiteSession, scopeSession,
|
||||
skipPrivateMembers = false,
|
||||
containingClassForAdditionalMembers = symbol.toLookupTag(),
|
||||
classFirDispatchReceiver = this,
|
||||
// TODO: why it's always false?
|
||||
isFromExpectClass = false
|
||||
)
|
||||
@@ -129,12 +128,12 @@ private fun FirClass<*>.scopeForSupertype(
|
||||
useSiteSession,
|
||||
scopeSession,
|
||||
skipPrivateMembers = true,
|
||||
containingClassForAdditionalMembers = subClass.symbol.toLookupTag(),
|
||||
classFirDispatchReceiver = subClass,
|
||||
isFromExpectClass = (subClass as? FirRegularClass)?.isExpect == true
|
||||
).let {
|
||||
if (delegateField != null) {
|
||||
scopeSession.getOrBuild(delegateField, DelegatedMemberScopeKey(delegateField.symbol.callableId)) {
|
||||
FirDelegatedMemberScope(it, useSiteSession, subClass.symbol.toLookupTag(), delegateField)
|
||||
FirDelegatedMemberScope(it, useSiteSession, subClass, delegateField)
|
||||
}
|
||||
} else {
|
||||
it
|
||||
@@ -146,18 +145,18 @@ private fun FirClass<*>.scopeForClassImpl(
|
||||
useSiteSession: FirSession,
|
||||
scopeSession: ScopeSession,
|
||||
skipPrivateMembers: Boolean,
|
||||
containingClassForAdditionalMembers: ConeClassLikeLookupTag,
|
||||
classFirDispatchReceiver: FirClass<*>,
|
||||
isFromExpectClass: Boolean
|
||||
): FirTypeScope {
|
||||
val basicScope = unsubstitutedScope(useSiteSession, scopeSession, withForcedTypeCalculator = false)
|
||||
if (substitutor == ConeSubstitutor.Empty) return basicScope
|
||||
|
||||
return scopeSession.getOrBuild(
|
||||
this, ConeSubstitutionScopeKey(containingClassForAdditionalMembers.classId, isFromExpectClass, substitutor)
|
||||
this, ConeSubstitutionScopeKey(classFirDispatchReceiver.classId, isFromExpectClass, substitutor)
|
||||
) {
|
||||
FirClassSubstitutionScope(
|
||||
useSiteSession, basicScope, substitutor, skipPrivateMembers,
|
||||
containingClassForAdditionalMembers.classId, makeExpect = isFromExpectClass
|
||||
useSiteSession, basicScope, substitutor, classFirDispatchReceiver.defaultType(),
|
||||
skipPrivateMembers, makeExpect = isFromExpectClass
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
+12
-8
@@ -12,13 +12,11 @@ import org.jetbrains.kotlin.fir.declarations.builder.*
|
||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
||||
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
|
||||
import org.jetbrains.kotlin.fir.resolve.substitution.chain
|
||||
import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap
|
||||
import org.jetbrains.kotlin.fir.scopes.FakeOverrideSubstitution
|
||||
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.runIf
|
||||
|
||||
@@ -26,8 +24,8 @@ class FirClassSubstitutionScope(
|
||||
private val session: FirSession,
|
||||
private val useSiteMemberScope: FirTypeScope,
|
||||
private val substitutor: ConeSubstitutor,
|
||||
private val dispatchReceiverTypeForSubstitutedMembers: ConeClassLikeType,
|
||||
private val skipPrivateMembers: Boolean,
|
||||
private val derivedClassId: ClassId? = null,
|
||||
private val makeExpect: Boolean = false
|
||||
) : FirTypeScope() {
|
||||
|
||||
@@ -35,6 +33,8 @@ class FirClassSubstitutionScope(
|
||||
private val fakeOverrideConstructors = mutableMapOf<FirConstructorSymbol, FirConstructorSymbol>()
|
||||
private val fakeOverrideVariables = mutableMapOf<FirVariableSymbol<*>, FirVariableSymbol<*>>()
|
||||
|
||||
private val newOwnerClassId = dispatchReceiverTypeForSubstitutedMembers.lookupTag.classId
|
||||
|
||||
override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> Unit) {
|
||||
useSiteMemberScope.processFunctionsByName(name) process@{ original ->
|
||||
val function = fakeOverrideFunctions.getOrPut(original) { createFakeOverrideFunction(original) }
|
||||
@@ -139,11 +139,12 @@ class FirClassSubstitutionScope(
|
||||
session,
|
||||
member,
|
||||
original,
|
||||
dispatchReceiverTypeForSubstitutedMembers,
|
||||
newReceiverType,
|
||||
newReturnType,
|
||||
newParameterTypes,
|
||||
newTypeParameters as List<FirTypeParameter>,
|
||||
derivedClassId,
|
||||
newOwnerClassId,
|
||||
makeExpect,
|
||||
fakeOverrideSubstitution
|
||||
)
|
||||
@@ -163,7 +164,8 @@ class FirClassSubstitutionScope(
|
||||
}
|
||||
return FirFakeOverrideGenerator.createFakeOverrideConstructor(
|
||||
FirConstructorSymbol(original.callableId, overriddenSymbol = original),
|
||||
session, constructor, newReturnType, newParameterTypes, newTypeParameters, makeExpect, fakeOverrideSubstitution
|
||||
session, constructor, dispatchReceiverTypeForSubstitutedMembers,
|
||||
newReturnType, newParameterTypes, newTypeParameters, makeExpect, fakeOverrideSubstitution
|
||||
).symbol
|
||||
}
|
||||
|
||||
@@ -184,10 +186,11 @@ class FirClassSubstitutionScope(
|
||||
session,
|
||||
member,
|
||||
original,
|
||||
dispatchReceiverTypeForSubstitutedMembers,
|
||||
newReceiverType,
|
||||
newReturnType,
|
||||
newTypeParameters as List<FirTypeParameter>,
|
||||
derivedClassId,
|
||||
newOwnerClassId,
|
||||
makeExpect,
|
||||
fakeOverrideSubstitution
|
||||
)
|
||||
@@ -205,7 +208,7 @@ class FirClassSubstitutionScope(
|
||||
val (newTypeParameters, substitutor) = FirFakeOverrideGenerator.createNewTypeParametersAndSubstitutor(
|
||||
member as FirTypeParameterRefsOwner,
|
||||
substitutor,
|
||||
forceTypeParametersRecreation = derivedClassId != null && derivedClassId != member.symbol.callableId.classId
|
||||
forceTypeParametersRecreation = dispatchReceiverTypeForSubstitutedMembers.lookupTag != member.dispatchReceiverClassOrNull()
|
||||
)
|
||||
|
||||
val receiverType = member.receiverTypeRef?.coneType
|
||||
@@ -226,7 +229,7 @@ class FirClassSubstitutionScope(
|
||||
// TODO: do we have fields with implicit type?
|
||||
val newReturnType = returnType?.substitute() ?: return original
|
||||
|
||||
return FirFakeOverrideGenerator.createFakeOverrideField(session, member, original, newReturnType, derivedClassId)
|
||||
return FirFakeOverrideGenerator.createFakeOverrideField(session, member, original, newReturnType, newOwnerClassId)
|
||||
}
|
||||
|
||||
private fun createFakeOverrideAccessor(original: FirAccessorSymbol): FirAccessorSymbol {
|
||||
@@ -250,6 +253,7 @@ class FirClassSubstitutionScope(
|
||||
session,
|
||||
member,
|
||||
original,
|
||||
dispatchReceiverTypeForSubstitutedMembers,
|
||||
newReturnType,
|
||||
newParameterTypes,
|
||||
fakeOverrideSubstitution
|
||||
|
||||
+8
-4
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.scopes.impl
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.resolve.defaultType
|
||||
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
||||
@@ -17,11 +18,12 @@ import org.jetbrains.kotlin.name.Name
|
||||
class FirDelegatedMemberScope(
|
||||
private val useSiteScope: FirTypeScope,
|
||||
private val session: FirSession,
|
||||
private val containingClass: ConeClassLikeLookupTag,
|
||||
private val containingClass: FirClass<*>,
|
||||
private val delegateField: FirField,
|
||||
) : FirTypeScope() {
|
||||
private val delegatedFunctionCache = mutableMapOf<FirNamedFunctionSymbol, FirNamedFunctionSymbol>()
|
||||
private val delegatedPropertyCache = mutableMapOf<FirPropertySymbol, FirPropertySymbol>()
|
||||
private val dispatchReceiverType = containingClass.defaultType()
|
||||
|
||||
override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> Unit) {
|
||||
useSiteScope.processFunctionsByName(name) processor@{ functionSymbol ->
|
||||
@@ -43,9 +45,10 @@ class FirDelegatedMemberScope(
|
||||
original,
|
||||
session,
|
||||
FirDeclarationOrigin.Delegated,
|
||||
newDispatchReceiverType = dispatchReceiverType,
|
||||
newModality = Modality.OPEN,
|
||||
).apply {
|
||||
delegatedWrapperData = DelegatedWrapperData(functionSymbol.fir, containingClass, delegateField)
|
||||
delegatedWrapperData = DelegatedWrapperData(functionSymbol.fir, containingClass.symbol.toLookupTag(), delegateField)
|
||||
}.symbol as FirNamedFunctionSymbol
|
||||
}
|
||||
processor(delegatedSymbol)
|
||||
@@ -72,8 +75,9 @@ class FirDelegatedMemberScope(
|
||||
original,
|
||||
session,
|
||||
newModality = Modality.OPEN,
|
||||
newDispatchReceiverType = dispatchReceiverType,
|
||||
).apply {
|
||||
delegatedWrapperData = DelegatedWrapperData(propertySymbol.fir, containingClass, delegateField)
|
||||
delegatedWrapperData = DelegatedWrapperData(propertySymbol.fir, containingClass.symbol.toLookupTag(), delegateField)
|
||||
}.symbol
|
||||
}
|
||||
processor(delegatedSymbol)
|
||||
@@ -105,7 +109,7 @@ class FirDelegatedMemberScope(
|
||||
): ProcessorAction {
|
||||
val wrappedData = (symbol.fir as? FirCallableMemberDeclaration<*>)?.delegatedWrapperData
|
||||
return when {
|
||||
wrappedData == null || wrappedData.containingClass != containingClass -> {
|
||||
wrappedData == null || wrappedData.containingClass != containingClass.symbol.toLookupTag() -> {
|
||||
useSiteScope.processDirectOverriddenCallablesWithBaseScope(symbol, processor)
|
||||
}
|
||||
else -> processor(wrappedData.wrapped.symbol as D, useSiteScope)
|
||||
|
||||
+29
-9
@@ -32,6 +32,7 @@ object FirFakeOverrideGenerator {
|
||||
session: FirSession,
|
||||
baseFunction: FirSimpleFunction,
|
||||
baseSymbol: FirNamedFunctionSymbol,
|
||||
newDispatchReceiverType: ConeKotlinType?,
|
||||
newReceiverType: ConeKotlinType? = null,
|
||||
newReturnType: ConeKotlinType? = null,
|
||||
newParameterTypes: List<ConeKotlinType?>? = null,
|
||||
@@ -45,7 +46,7 @@ object FirFakeOverrideGenerator {
|
||||
isFakeOverride = true, overriddenSymbol = baseSymbol
|
||||
)
|
||||
createFakeOverrideFunction(
|
||||
symbol, session, baseFunction, newReceiverType, newReturnType,
|
||||
symbol, session, baseFunction, newDispatchReceiverType, newReceiverType, newReturnType,
|
||||
newParameterTypes, newTypeParameters, isExpect, fakeOverrideSubstitution
|
||||
)
|
||||
return symbol
|
||||
@@ -55,6 +56,7 @@ object FirFakeOverrideGenerator {
|
||||
fakeOverrideSymbol: FirFunctionSymbol<FirSimpleFunction>,
|
||||
session: FirSession,
|
||||
baseFunction: FirSimpleFunction,
|
||||
newDispatchReceiverType: ConeKotlinType?,
|
||||
newReceiverType: ConeKotlinType?,
|
||||
newReturnType: ConeKotlinType?,
|
||||
newParameterTypes: List<ConeKotlinType?>?,
|
||||
@@ -70,6 +72,7 @@ object FirFakeOverrideGenerator {
|
||||
session,
|
||||
FirDeclarationOrigin.SubstitutionOverride,
|
||||
isExpect,
|
||||
newDispatchReceiverType,
|
||||
newParameterTypes,
|
||||
newTypeParameters,
|
||||
newReceiverType,
|
||||
@@ -84,6 +87,7 @@ object FirFakeOverrideGenerator {
|
||||
session: FirSession,
|
||||
origin: FirDeclarationOrigin,
|
||||
isExpect: Boolean = baseFunction.isExpect,
|
||||
newDispatchReceiverType: ConeKotlinType?,
|
||||
newParameterTypes: List<ConeKotlinType?>? = null,
|
||||
newTypeParameters: List<FirTypeParameter>? = null,
|
||||
newReceiverType: ConeKotlinType? = null,
|
||||
@@ -101,6 +105,8 @@ object FirFakeOverrideGenerator {
|
||||
symbol = newSymbol
|
||||
resolvePhase = baseFunction.resolvePhase
|
||||
|
||||
dispatchReceiverType = newDispatchReceiverType
|
||||
attributes = baseFunction.attributes.copy()
|
||||
typeParameters += configureAnnotationsTypeParametersAndSignature(
|
||||
session, baseFunction, newParameterTypes,
|
||||
newTypeParameters, newReceiverType, newReturnType, fakeOverrideSubstitution
|
||||
@@ -112,6 +118,7 @@ object FirFakeOverrideGenerator {
|
||||
fakeOverrideSymbol: FirConstructorSymbol,
|
||||
session: FirSession,
|
||||
baseConstructor: FirConstructor,
|
||||
newDispatchReceiverType: ConeKotlinType?,
|
||||
newReturnType: ConeKotlinType?,
|
||||
newParameterTypes: List<ConeKotlinType?>?,
|
||||
newTypeParameters: List<FirTypeParameterRef>?,
|
||||
@@ -121,17 +128,21 @@ object FirFakeOverrideGenerator {
|
||||
// TODO: consider using here some light-weight functions instead of pseudo-real FirMemberFunctionImpl
|
||||
// As second alternative, we can invent some light-weight kind of FirRegularClass
|
||||
return buildConstructor {
|
||||
source = baseConstructor.source
|
||||
this.session = session
|
||||
origin = FirDeclarationOrigin.SubstitutionOverride
|
||||
receiverTypeRef = baseConstructor.receiverTypeRef?.withReplacedConeType(null)
|
||||
status = baseConstructor.status.updatedStatus(isExpect)
|
||||
symbol = fakeOverrideSymbol
|
||||
resolvePhase = baseConstructor.resolvePhase
|
||||
|
||||
typeParameters += configureAnnotationsTypeParametersAndSignature(
|
||||
session, baseConstructor, newParameterTypes, newTypeParameters, newReceiverType = null, newReturnType, fakeOverrideSubstitution
|
||||
)
|
||||
|
||||
dispatchReceiverType = newDispatchReceiverType
|
||||
|
||||
resolvePhase = baseConstructor.resolvePhase
|
||||
source = baseConstructor.source
|
||||
attributes = baseConstructor.attributes.copy()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -235,6 +246,7 @@ object FirFakeOverrideGenerator {
|
||||
session: FirSession,
|
||||
baseProperty: FirProperty,
|
||||
baseSymbol: FirPropertySymbol,
|
||||
newDispatchReceiverType: ConeKotlinType?,
|
||||
newReceiverType: ConeKotlinType? = null,
|
||||
newReturnType: ConeKotlinType? = null,
|
||||
newTypeParameters: List<FirTypeParameter>? = null,
|
||||
@@ -248,7 +260,7 @@ object FirFakeOverrideGenerator {
|
||||
)
|
||||
createCopyForFirProperty(
|
||||
symbol, baseProperty, session, isExpect,
|
||||
newTypeParameters, newReceiverType, newReturnType,
|
||||
newDispatchReceiverType, newTypeParameters, newReceiverType, newReturnType,
|
||||
fakeOverrideSubstitution = fakeOverrideSubstitution
|
||||
)
|
||||
return symbol
|
||||
@@ -259,6 +271,7 @@ object FirFakeOverrideGenerator {
|
||||
baseProperty: FirProperty,
|
||||
session: FirSession,
|
||||
isExpect: Boolean = baseProperty.isExpect,
|
||||
newDispatchReceiverType: ConeKotlinType?,
|
||||
newTypeParameters: List<FirTypeParameter>? = null,
|
||||
newReceiverType: ConeKotlinType? = null,
|
||||
newReturnType: ConeKotlinType? = null,
|
||||
@@ -277,6 +290,8 @@ object FirFakeOverrideGenerator {
|
||||
status = baseProperty.status.updatedStatus(isExpect, newModality, newVisibility)
|
||||
|
||||
resolvePhase = baseProperty.resolvePhase
|
||||
dispatchReceiverType = newDispatchReceiverType
|
||||
attributes = baseProperty.attributes.copy()
|
||||
typeParameters += configureAnnotationsTypeParametersAndSignature(
|
||||
baseProperty,
|
||||
newTypeParameters,
|
||||
@@ -373,17 +388,20 @@ object FirFakeOverrideGenerator {
|
||||
CallableId(derivedClassId ?: baseSymbol.callableId.classId!!, baseField.name)
|
||||
)
|
||||
buildField {
|
||||
source = baseField.source
|
||||
this.session = session
|
||||
origin = FirDeclarationOrigin.SubstitutionOverride
|
||||
resolvePhase = baseField.resolvePhase
|
||||
returnTypeRef = baseField.returnTypeRef.withReplacedConeType(newReturnType)
|
||||
name = baseField.name
|
||||
this.symbol = symbol
|
||||
origin = FirDeclarationOrigin.SubstitutionOverride
|
||||
returnTypeRef = baseField.returnTypeRef.withReplacedConeType(newReturnType)
|
||||
|
||||
source = baseField.source
|
||||
resolvePhase = baseField.resolvePhase
|
||||
name = baseField.name
|
||||
isVar = baseField.isVar
|
||||
status = baseField.status
|
||||
resolvePhase = baseField.resolvePhase
|
||||
annotations += baseField.annotations
|
||||
attributes = baseField.attributes.copy()
|
||||
dispatchReceiverType = baseField.dispatchReceiverType
|
||||
}
|
||||
return symbol
|
||||
}
|
||||
@@ -392,6 +410,7 @@ object FirFakeOverrideGenerator {
|
||||
session: FirSession,
|
||||
baseProperty: FirSyntheticProperty,
|
||||
baseSymbol: FirAccessorSymbol,
|
||||
newDispatchReceiverType: ConeKotlinType?,
|
||||
newReturnType: ConeKotlinType?,
|
||||
newParameterTypes: List<ConeKotlinType?>?,
|
||||
fakeOverrideSubstitution: FakeOverrideSubstitution?
|
||||
@@ -401,6 +420,7 @@ object FirFakeOverrideGenerator {
|
||||
functionSymbol,
|
||||
session,
|
||||
baseProperty.getter.delegate,
|
||||
newDispatchReceiverType,
|
||||
newReceiverType = null,
|
||||
newReturnType,
|
||||
newParameterTypes,
|
||||
|
||||
+12
-9
@@ -10,16 +10,13 @@ import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.dispatchReceiverClassOrNull
|
||||
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
|
||||
import org.jetbrains.kotlin.fir.scopes.*
|
||||
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||
import org.jetbrains.kotlin.fir.symbols.PossiblyFirFakeOverrideSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.ConeFlexibleType
|
||||
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||
import org.jetbrains.kotlin.fir.types.ConeTypeCheckerContext
|
||||
import org.jetbrains.kotlin.fir.types.coneTypeSafe
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
||||
import org.jetbrains.kotlin.types.AbstractTypeCheckerContext
|
||||
@@ -30,7 +27,7 @@ class FirTypeIntersectionScope private constructor(
|
||||
session: FirSession,
|
||||
overrideChecker: FirOverrideChecker,
|
||||
private val scopes: List<FirTypeScope>,
|
||||
private val derivedClassId: ClassId?,
|
||||
private val dispatchReceiverType: ConeKotlinType,
|
||||
) : AbstractFirOverrideScope(session, overrideChecker) {
|
||||
private val absentFunctions: MutableSet<Name> = mutableSetOf()
|
||||
private val absentProperties: MutableSet<Name> = mutableSetOf()
|
||||
@@ -261,9 +258,13 @@ class FirTypeIntersectionScope private constructor(
|
||||
newModality: Modality,
|
||||
newVisibility: Visibility,
|
||||
): FirNamedFunctionSymbol {
|
||||
|
||||
val newSymbol =
|
||||
FirNamedFunctionSymbol(
|
||||
CallableId(derivedClassId ?: mostSpecific.callableId.classId!!, mostSpecific.fir.name),
|
||||
CallableId(
|
||||
dispatchReceiverType.classId ?: mostSpecific.dispatchReceiverClassOrNull()?.classId!!,
|
||||
mostSpecific.fir.name
|
||||
),
|
||||
mostSpecific.isFakeOverride,
|
||||
mostSpecific,
|
||||
isIntersectionOverride = true
|
||||
@@ -273,6 +274,7 @@ class FirTypeIntersectionScope private constructor(
|
||||
newSymbol,
|
||||
mostSpecificFunction, session, FirDeclarationOrigin.IntersectionOverride,
|
||||
mostSpecificFunction.isExpect,
|
||||
newDispatchReceiverType = dispatchReceiverType,
|
||||
newModality = newModality,
|
||||
newVisibility = newVisibility,
|
||||
)
|
||||
@@ -290,6 +292,7 @@ class FirTypeIntersectionScope private constructor(
|
||||
newSymbol, mostSpecificProperty, mostSpecificProperty.session,
|
||||
newModality = newModality,
|
||||
newVisibility = newVisibility,
|
||||
newDispatchReceiverType = dispatchReceiverType,
|
||||
)
|
||||
return newSymbol
|
||||
}
|
||||
@@ -486,10 +489,10 @@ class FirTypeIntersectionScope private constructor(
|
||||
session: FirSession,
|
||||
overrideChecker: FirOverrideChecker,
|
||||
scopes: List<FirTypeScope>,
|
||||
derivedClassId: ClassId? = null,
|
||||
dispatchReceiverType: ConeKotlinType,
|
||||
): FirTypeScope {
|
||||
scopes.singleOrNull()?.let { return it }
|
||||
return FirTypeIntersectionScope(session, overrideChecker, scopes, derivedClassId)
|
||||
return FirTypeIntersectionScope(session, overrideChecker, scopes, dispatchReceiverType)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
@@ -108,6 +108,7 @@ inline fun buildConstructorCopy(original: FirConstructor, init: FirConstructorBu
|
||||
copyBuilder.valueParameters.addAll(original.valueParameters)
|
||||
copyBuilder.status = original.status
|
||||
copyBuilder.containerSource = original.containerSource
|
||||
copyBuilder.dispatchReceiverType = original.dispatchReceiverType
|
||||
copyBuilder.annotations.addAll(original.annotations)
|
||||
copyBuilder.symbol = original.symbol
|
||||
copyBuilder.delegatedConstructor = original.delegatedConstructor
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
/*
|
||||
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.fir
|
||||
|
||||
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationDataKey
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationDataRegistry
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
||||
import org.jetbrains.kotlin.fir.types.ConeIntersectionType
|
||||
|
||||
fun FirCallableSymbol<*>.dispatchReceiverClassOrNull(): ConeClassLikeLookupTag? =
|
||||
(fir as? FirCallableMemberDeclaration<*>)?.dispatchReceiverClassOrNull()
|
||||
|
||||
fun FirCallableDeclaration<*>.dispatchReceiverClassOrNull(): ConeClassLikeLookupTag? {
|
||||
if (this !is FirCallableMemberDeclaration<*>) return null
|
||||
if (symbol.isIntersectionOverride && dispatchReceiverType is ConeIntersectionType) return symbol.overriddenSymbol!!.fir.dispatchReceiverClassOrNull()
|
||||
|
||||
return (dispatchReceiverType as? ConeClassLikeType)?.lookupTag
|
||||
}
|
||||
|
||||
fun FirCallableSymbol<*>.containingClass(): ConeClassLikeLookupTag? = fir.containingClass()
|
||||
fun FirCallableDeclaration<*>.containingClass(): ConeClassLikeLookupTag? {
|
||||
return (containingClassAttr ?: dispatchReceiverClassOrNull())
|
||||
}
|
||||
|
||||
private object ContainingClassKey : FirDeclarationDataKey()
|
||||
var FirCallableDeclaration<*>.containingClassAttr: ConeClassLikeLookupTag? by FirDeclarationDataRegistry.data(ContainingClassKey)
|
||||
@@ -55,6 +55,8 @@ fun FirRegularClassBuilder.generateValuesFunction(
|
||||
symbol = FirNamedFunctionSymbol(CallableId(packageFqName, classFqName, ENUM_VALUES))
|
||||
resolvePhase = FirResolvePhase.BODY_RESOLVE
|
||||
body = buildEmptyExpressionBlock()
|
||||
}.apply {
|
||||
containingClassAttr = this@generateValuesFunction.symbol.toLookupTag()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -93,5 +95,7 @@ fun FirRegularClassBuilder.generateValueOfFunction(
|
||||
}
|
||||
resolvePhase = FirResolvePhase.BODY_RESOLVE
|
||||
body = buildEmptyExpressionBlock()
|
||||
}.apply {
|
||||
containingClassAttr = this@generateValueOfFunction.symbol.toLookupTag()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user