FIR: Initialize dispatchReceiverType and containingClassAttr for callable members

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