IR: Refactor IrBuiltIns to abstract it from descriptors
This commit is contained in:
committed by
TeamCityServer
parent
25d2e61a82
commit
dee0487185
@@ -20,7 +20,7 @@ import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltInsOverDescriptors
|
||||
import org.jetbrains.kotlin.ir.linkage.IrDeserializer
|
||||
import org.jetbrains.kotlin.ir.linkage.IrProvider
|
||||
import org.jetbrains.kotlin.ir.symbols.IrSymbol
|
||||
@@ -63,7 +63,7 @@ class Psi2IrTranslator(
|
||||
symbolTable,
|
||||
extensions,
|
||||
typeTranslator,
|
||||
IrBuiltIns(moduleDescriptor.builtIns, typeTranslator, symbolTable),
|
||||
IrBuiltInsOverDescriptors(moduleDescriptor.builtIns, typeTranslator, symbolTable),
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -36,7 +36,6 @@ import org.jetbrains.kotlin.resolve.bindingContextUtil.isUsedAsResultOfLambda
|
||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassOrAny
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
import java.util.*
|
||||
|
||||
class BodyGenerator(
|
||||
val scopeOwnerSymbol: IrSymbol,
|
||||
@@ -112,7 +111,7 @@ class BodyGenerator(
|
||||
ktBody.startOffsetSkippingComments, ktBody.endOffset,
|
||||
IrGetObjectValueImpl(
|
||||
ktBody.startOffsetSkippingComments, ktBody.endOffset, context.irBuiltIns.unitType,
|
||||
context.symbolTable.referenceClass(context.builtIns.unit)
|
||||
context.irBuiltIns.unitClass
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -262,7 +261,7 @@ class BodyGenerator(
|
||||
}
|
||||
|
||||
private fun generateAnySuperConstructorCall(body: IrBlockBody, ktElement: KtPureElement) {
|
||||
val anyConstructor = context.builtIns.any.constructors.single()
|
||||
val anyConstructor = context.irBuiltIns.anyClass.descriptor.constructors.single()
|
||||
body.statements.add(
|
||||
IrDelegatingConstructorCallImpl.fromSymbolDescriptor(
|
||||
ktElement.pureStartOffset, ktElement.pureEndOffset,
|
||||
@@ -273,7 +272,7 @@ class BodyGenerator(
|
||||
}
|
||||
|
||||
private fun generateEnumSuperConstructorCall(body: IrBlockBody, ktElement: KtElement, classDescriptor: ClassDescriptor) {
|
||||
val enumConstructor = context.builtIns.enum.constructors.single()
|
||||
val enumConstructor = context.irBuiltIns.enumClass.descriptor.constructors.single()
|
||||
body.statements.add(
|
||||
IrEnumConstructorCallImpl.fromSymbolDescriptor(
|
||||
ktElement.startOffsetSkippingComments, ktElement.endOffset,
|
||||
|
||||
+1
-1
@@ -92,7 +92,7 @@ class DataClassMembersGenerator(
|
||||
|
||||
private fun getHashCodeFunction(type: KotlinType): FunctionDescriptor =
|
||||
type.memberScope.findHashCodeFunctionOrNull()
|
||||
?: context.builtIns.any.unsubstitutedMemberScope.findHashCodeFunctionOrNull()!!
|
||||
?: context.irBuiltIns.anyClass.descriptor.unsubstitutedMemberScope.findHashCodeFunctionOrNull()!!
|
||||
|
||||
private fun getHashCodeFunction(
|
||||
type: KotlinType,
|
||||
|
||||
+1
-1
@@ -6,8 +6,8 @@
|
||||
package org.jetbrains.kotlin.psi2ir.generators
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.declarations.lazy.LazyScopedTypeParametersResolver
|
||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.linkage.IrDeserializer
|
||||
import org.jetbrains.kotlin.ir.linkage.IrProvider
|
||||
import org.jetbrains.kotlin.ir.util.DeclarationStubGenerator
|
||||
|
||||
@@ -26,7 +26,6 @@ import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
import org.jetbrains.kotlin.util.slicedMap.ReadOnlySlice
|
||||
import java.lang.RuntimeException
|
||||
|
||||
|
||||
interface Generator : IrGenerator {
|
||||
@@ -55,7 +54,7 @@ fun Generator.getExpressionTypeWithCoercionToUnit(key: KtExpression): KotlinType
|
||||
if (key.isUsedAsExpression(context.bindingContext))
|
||||
getTypeInferredByFrontend(key)
|
||||
else
|
||||
context.builtIns.unitType
|
||||
context.irBuiltInsOverDescriptors.unit
|
||||
|
||||
fun Generator.getExpressionTypeWithCoercionToUnitOrFail(key: KtExpression): KotlinType =
|
||||
getExpressionTypeWithCoercionToUnit(key) ?: throw RuntimeException("No type for expression: ${key.text}")
|
||||
|
||||
+4
-1
@@ -11,8 +11,9 @@ import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.NotFoundClasses
|
||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.builders.IrGeneratorContext
|
||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltInsOverDescriptors
|
||||
import org.jetbrains.kotlin.ir.expressions.IrDeclarationReference
|
||||
import org.jetbrains.kotlin.ir.util.SymbolTable
|
||||
import org.jetbrains.kotlin.ir.util.TypeTranslator
|
||||
@@ -65,6 +66,8 @@ class GeneratorContext private constructor(
|
||||
|
||||
val samTypeApproximator = SamTypeApproximator(moduleDescriptor.builtIns, languageVersionSettings)
|
||||
|
||||
val irBuiltInsOverDescriptors: IrBuiltInsOverDescriptors get() = irBuiltIns as IrBuiltInsOverDescriptors
|
||||
|
||||
fun createFileScopeContext(ktFile: KtFile): GeneratorContext {
|
||||
return GeneratorContext(
|
||||
configuration,
|
||||
|
||||
+14
-3
@@ -45,7 +45,18 @@ import org.jetbrains.kotlin.resolve.checkers.PrimitiveNumericComparisonInfo
|
||||
import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator
|
||||
import org.jetbrains.kotlin.types.*
|
||||
import org.jetbrains.kotlin.types.checker.intersectTypes
|
||||
import org.jetbrains.kotlin.types.typeUtil.*
|
||||
import org.jetbrains.kotlin.types.typeUtil.isPrimitiveNumberType
|
||||
import org.jetbrains.kotlin.types.typeUtil.makeNotNullable
|
||||
import org.jetbrains.kotlin.types.typeUtil.makeNullable
|
||||
import kotlin.collections.Map
|
||||
import kotlin.collections.contains
|
||||
import kotlin.collections.get
|
||||
import kotlin.collections.listOf
|
||||
import kotlin.collections.mapOf
|
||||
import kotlin.collections.mapTo
|
||||
import kotlin.collections.set
|
||||
import kotlin.collections.toMap
|
||||
import kotlin.collections.zip
|
||||
|
||||
|
||||
class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
|
||||
@@ -205,7 +216,7 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat
|
||||
// Infer type for elvis manually. Take into account possibly nested elvises.
|
||||
val rightType = getResultTypeForElvis(binaryExpression.right!!).unwrap()
|
||||
val leftType = getResultTypeForElvis(binaryExpression.left!!).unwrap()
|
||||
val leftNNType = intersectTypes(listOf(leftType, context.builtIns.anyType))
|
||||
val leftNNType = intersectTypes(listOf(leftType, context.irBuiltInsOverDescriptors.any))
|
||||
return NewCommonSuperTypeCalculator.commonSuperType(listOf(rightType, leftNNType))
|
||||
}
|
||||
|
||||
@@ -432,7 +443,7 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat
|
||||
return memberScope.findSingleFunction(Name.identifier("to$targetTypeName"))
|
||||
}
|
||||
|
||||
private val primitiveTypeMapping = context.irBuiltIns.run { primitiveTypes.zip(primitiveIrTypes).toMap() }
|
||||
private val primitiveTypeMapping = context.irBuiltInsOverDescriptors.run { primitiveTypes.zip(primitiveIrTypes).toMap() }
|
||||
private fun kotlinTypeToIrType(kotlinType: KotlinType?) = kotlinType?.let { primitiveTypeMapping[it] }
|
||||
|
||||
private fun generateComparisonOperator(ktExpression: KtBinaryExpression, origin: IrStatementOrigin): IrExpression {
|
||||
|
||||
+3
-5
@@ -19,10 +19,8 @@ package org.jetbrains.kotlin.psi2ir.generators
|
||||
import org.jetbrains.kotlin.builtins.*
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||
import org.jetbrains.kotlin.ir.declarations.DescriptorMetadataSource
|
||||
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
|
||||
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
||||
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltInsOverDescriptors
|
||||
import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.*
|
||||
import org.jetbrains.kotlin.ir.symbols.*
|
||||
@@ -537,7 +535,7 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
|
||||
}
|
||||
|
||||
private fun KotlinType.kFunctionTypeToFunctionType(suspendFunction: Boolean) = createFunctionType(
|
||||
statementGenerator.context.builtIns,
|
||||
(statementGenerator.context.irBuiltIns as IrBuiltInsOverDescriptors).builtIns,
|
||||
annotations,
|
||||
null,
|
||||
arguments.dropLast(1).map { it.type },
|
||||
|
||||
+1
-2
@@ -22,7 +22,6 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.VariableDescriptorWithAccessors
|
||||
import org.jetbrains.kotlin.ir.IrStatement
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.builders.Scope
|
||||
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
|
||||
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
|
||||
@@ -191,7 +190,7 @@ class StatementGenerator(
|
||||
val irReturnedExpression = expression.returnedExpression?.let { generateExpression(it) }
|
||||
?: IrGetObjectValueImpl(
|
||||
expression.startOffsetSkippingComments, expression.endOffset, context.irBuiltIns.unitType,
|
||||
context.symbolTable.referenceClass(context.builtIns.unit)
|
||||
context.irBuiltIns.unitClass
|
||||
)
|
||||
return IrReturnImpl(
|
||||
expression.startOffsetSkippingComments, expression.endOffset, context.irBuiltIns.nothingType,
|
||||
|
||||
+1
-1
@@ -71,7 +71,7 @@ class ArrayAccessAssignmentReceiver(
|
||||
?: throw AssertionError("Array access should have either indexed-get call or indexed-set call")
|
||||
|
||||
val hasResult = origin.isAssignmentOperatorWithResult()
|
||||
val resultType = if (hasResult) kotlinType else callGenerator.context.builtIns.unitType
|
||||
val resultType = if (hasResult) kotlinType else callGenerator.context.irBuiltInsOverDescriptors.unit
|
||||
val irResultType = callGenerator.translateType(resultType)
|
||||
|
||||
if (indexedGetDescriptor?.isDynamic() != false && indexedSetDescriptor?.isDynamic() != false) {
|
||||
|
||||
+5
-8
@@ -22,13 +22,12 @@ import org.jetbrains.kotlin.builtins.isFunctionType
|
||||
import org.jetbrains.kotlin.builtins.isSuspendFunctionType
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.IrStatement
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.PsiIrFileEntry
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.descriptors.IrBasedDeclarationDescriptor
|
||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl
|
||||
@@ -60,7 +59,6 @@ import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
|
||||
fun insertImplicitCasts(file: IrFile, context: GeneratorContext) {
|
||||
InsertImplicitCasts(
|
||||
context.builtIns,
|
||||
context.irBuiltIns,
|
||||
context.typeTranslator,
|
||||
context.callToSubstitutedDescriptorMap,
|
||||
@@ -71,7 +69,6 @@ fun insertImplicitCasts(file: IrFile, context: GeneratorContext) {
|
||||
}
|
||||
|
||||
internal class InsertImplicitCasts(
|
||||
private val builtIns: KotlinBuiltIns,
|
||||
private val irBuiltIns: IrBuiltIns,
|
||||
private val typeTranslator: TypeTranslator,
|
||||
private val callToSubstitutedDescriptorMap: Map<IrDeclarationReference, CallableDescriptor>,
|
||||
@@ -260,20 +257,20 @@ internal class InsertImplicitCasts(
|
||||
override fun visitWhen(expression: IrWhen): IrExpression =
|
||||
expression.transformPostfix {
|
||||
for (irBranch in branches) {
|
||||
irBranch.condition = irBranch.condition.cast(builtIns.booleanType)
|
||||
irBranch.condition = irBranch.condition.cast(irBuiltIns.booleanType)
|
||||
irBranch.result = irBranch.result.cast(type)
|
||||
}
|
||||
}
|
||||
|
||||
override fun visitLoop(loop: IrLoop): IrExpression =
|
||||
loop.transformPostfix {
|
||||
condition = condition.cast(builtIns.booleanType)
|
||||
condition = condition.cast(irBuiltIns.booleanType)
|
||||
body = body?.coerceToUnit()
|
||||
}
|
||||
|
||||
override fun visitThrow(expression: IrThrow): IrExpression =
|
||||
expression.transformPostfix {
|
||||
value = value.cast(builtIns.throwable.defaultType)
|
||||
value = value.cast(irBuiltIns.throwableType)
|
||||
}
|
||||
|
||||
override fun visitTry(aTry: IrTry): IrExpression =
|
||||
@@ -469,7 +466,7 @@ internal class InsertImplicitCasts(
|
||||
}
|
||||
|
||||
private fun IrExpression.invokeIntegerCoercionFunction(targetType: KotlinType, coercionFunName: String): IrExpression {
|
||||
val coercionFunction = builtIns.int.unsubstitutedMemberScope.findSingleFunction(Name.identifier(coercionFunName))
|
||||
val coercionFunction = irBuiltIns.intClass.descriptor.unsubstitutedMemberScope.findSingleFunction(Name.identifier(coercionFunName))
|
||||
return IrCallImpl(
|
||||
startOffset, endOffset,
|
||||
targetType.toIrType(),
|
||||
|
||||
Reference in New Issue
Block a user