FIR: Initialize dispatchReceiverType and containingClassAttr for callable members
This commit is contained in:
+11
-3
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
|||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.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!!
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+8
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.fir.deserialization.FirBuiltinAnnotationDeserializer
|
|||||||
import org.jetbrains.kotlin.fir.deserialization.FirConstDeserializer
|
import org.jetbrains.kotlin.fir.deserialization.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 })
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-3
@@ -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 {
|
||||||
|
|||||||
+8
-2
@@ -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 ->
|
||||||
|
|||||||
+5
-1
@@ -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
-2
@@ -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,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+11
-1
@@ -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()}")
|
||||||
|
|||||||
+2
-1
@@ -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 {
|
||||||
|
|||||||
+20
-4
@@ -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)
|
||||||
|
|||||||
+18
-1
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.fir.references.builder.*
|
|||||||
import org.jetbrains.kotlin.fir.references.impl.FirSimpleNamedReference
|
import org.jetbrains.kotlin.fir.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,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-2
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-1
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
|||||||
import org.jetbrains.kotlin.fir.declarations.builder.buildRegularClass
|
import org.jetbrains.kotlin.fir.declarations.builder.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<*>? {
|
||||||
|
|||||||
+2
-1
@@ -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
-8
@@ -12,13 +12,11 @@ import org.jetbrains.kotlin.fir.declarations.builder.*
|
|||||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
import org.jetbrains.kotlin.fir.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
-4
@@ -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)
|
||||||
|
|||||||
+29
-9
@@ -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,
|
||||||
|
|||||||
+12
-9
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user