IrTypes: use proper scope for type parameters in stub generation

This commit is contained in:
Dmitry Petrov
2018-05-30 15:06:35 +03:00
parent f837537cb6
commit 3a11767fae
3 changed files with 29 additions and 29 deletions
@@ -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)
}
}
}