IrTypes: use proper scope for type parameters in stub generation
This commit is contained in:
+2
-9
@@ -50,13 +50,6 @@ class InsertImplicitCasts(context: GeneratorContext) : IrElementTransformerVoid(
|
||||
private val typeTranslator = TypeTranslator(context.moduleDescriptor, symbolTable)
|
||||
private fun KotlinType.toIrType() = typeTranslator.translateType(this)
|
||||
|
||||
private inline fun <T> runInTypeParameterScope(typeParametersContainer: IrTypeParametersContainer, fn: () -> T): T {
|
||||
typeTranslator.enterScope(typeParametersContainer)
|
||||
val result = fn()
|
||||
typeTranslator.leaveScope()
|
||||
return result
|
||||
}
|
||||
|
||||
override fun visitCallableReference(expression: IrCallableReference): IrExpression =
|
||||
expression.transformPostfix {
|
||||
transformReceiverArguments()
|
||||
@@ -128,7 +121,7 @@ class InsertImplicitCasts(context: GeneratorContext) : IrElementTransformerVoid(
|
||||
}
|
||||
|
||||
override fun visitFunction(declaration: IrFunction): IrStatement =
|
||||
runInTypeParameterScope(declaration) {
|
||||
typeTranslator.buildWithScope(declaration) {
|
||||
declaration.transformPostfix {
|
||||
valueParameters.forEach {
|
||||
it.defaultValue?.coerceInnerExpression(it.descriptor.type)
|
||||
@@ -137,7 +130,7 @@ class InsertImplicitCasts(context: GeneratorContext) : IrElementTransformerVoid(
|
||||
}
|
||||
|
||||
override fun visitClass(declaration: IrClass): IrStatement =
|
||||
runInTypeParameterScope(declaration) {
|
||||
typeTranslator.buildWithScope(declaration) {
|
||||
super.visitClass(declaration)
|
||||
}
|
||||
|
||||
|
||||
@@ -86,10 +86,10 @@ class DeclarationStubGenerator(
|
||||
).also { irFunction ->
|
||||
generateTypeParameterStubs(descriptor.propertyIfAccessor.typeParameters, irFunction)
|
||||
|
||||
// TODO make sure that type parameters have proper scopes
|
||||
irFunction.returnType = descriptor.returnType!!.toIrType()
|
||||
|
||||
generateValueParametersStubs(irFunction)
|
||||
typeTranslator.buildWithScope(irFunction) {
|
||||
irFunction.returnType = descriptor.returnType!!.toIrType()
|
||||
generateValueParametersStubs(irFunction)
|
||||
}
|
||||
}
|
||||
|
||||
private fun generateConstructorStub(descriptor: ClassConstructorDescriptor): IrConstructor =
|
||||
@@ -98,7 +98,6 @@ class DeclarationStubGenerator(
|
||||
).also { irConstructor ->
|
||||
// So far, constructors in Kotlin can't have type parameters of their own.
|
||||
irConstructor.returnType = descriptor.returnType.toIrType()
|
||||
|
||||
generateValueParametersStubs(irConstructor)
|
||||
}
|
||||
|
||||
@@ -137,15 +136,17 @@ class DeclarationStubGenerator(
|
||||
symbolTable.declareClass(UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, descriptor).also { irClass ->
|
||||
generateTypeParameterStubs(descriptor.declaredTypeParameters, irClass)
|
||||
|
||||
// TODO get rid of code duplication, see ClassGenerator#generateClass
|
||||
descriptor.typeConstructor.supertypes.mapNotNullTo(irClass.superTypes) {
|
||||
it.toIrType()
|
||||
}
|
||||
typeTranslator.buildWithScope(irClass) {
|
||||
// TODO get rid of code duplication, see ClassGenerator#generateClass
|
||||
descriptor.typeConstructor.supertypes.mapNotNullTo(irClass.superTypes) {
|
||||
it.toIrType()
|
||||
}
|
||||
|
||||
irClass.thisReceiver = descriptor.thisAsReceiverParameter.generateReceiverParameterStub()
|
||||
generateChildStubs(descriptor.constructors, irClass)
|
||||
generateMemberStubs(descriptor.defaultType.memberScope, irClass)
|
||||
generateMemberStubs(descriptor.staticScope, irClass)
|
||||
irClass.thisReceiver = descriptor.thisAsReceiverParameter.generateReceiverParameterStub()
|
||||
generateChildStubs(descriptor.constructors, irClass)
|
||||
generateMemberStubs(descriptor.defaultType.memberScope, irClass)
|
||||
generateMemberStubs(descriptor.staticScope, irClass)
|
||||
}
|
||||
}
|
||||
|
||||
private fun generateEnumEntryStub(descriptor: ClassDescriptor): IrEnumEntry =
|
||||
@@ -154,12 +155,12 @@ class DeclarationStubGenerator(
|
||||
private fun generateTypeParameterStubs(typeParameters: List<TypeParameterDescriptor>, container: IrTypeParametersContainer) {
|
||||
typeParameters.mapTo(container.typeParameters) { generateTypeParameterStub(it) }
|
||||
|
||||
typeTranslator.enterScope(container)
|
||||
for (typeParameter in container.typeParameters) {
|
||||
val descriptor = typeParameter.descriptor
|
||||
descriptor.upperBounds.mapTo(typeParameter.superTypes) { it.toIrType() }
|
||||
typeTranslator.buildWithScope(container) {
|
||||
for (typeParameter in container.typeParameters) {
|
||||
val descriptor = typeParameter.descriptor
|
||||
descriptor.upperBounds.mapTo(typeParameter.superTypes) { it.toIrType() }
|
||||
}
|
||||
}
|
||||
typeTranslator.leaveScope()
|
||||
}
|
||||
|
||||
private fun generateTypeParameterStub(descriptor: TypeParameterDescriptor): IrTypeParameter =
|
||||
|
||||
@@ -36,6 +36,13 @@ class TypeTranslator(
|
||||
typeParametersResolver.leaveTypeParameterScope()
|
||||
}
|
||||
|
||||
inline fun <T> buildWithScope(container: IrTypeParametersContainer, builder: () -> T): T {
|
||||
enterScope(container)
|
||||
val result = builder()
|
||||
leaveScope()
|
||||
return result
|
||||
}
|
||||
|
||||
private fun resolveTypeParameter(typeParameterDescriptor: TypeParameterDescriptor) =
|
||||
typeParametersResolver.resolveScopedTypeParameter(typeParameterDescriptor)
|
||||
?: symbolTable.referenceTypeParameter(typeParameterDescriptor)
|
||||
@@ -100,5 +107,4 @@ class TypeTranslator(
|
||||
else
|
||||
translateType(it.type, it.projectionKind)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user