Generate parameter declarations for fake overrides

This commit is contained in:
Dmitry Petrov
2017-05-02 12:02:31 +03:00
parent fa4dc26814
commit 78a601af87
160 changed files with 1204 additions and 12 deletions
@@ -65,7 +65,7 @@ class ClassGenerator(declarationGenerator: DeclarationGenerator) : DeclarationGe
generateMembersDeclaredInClassBody(irClass, ktClassOrObject)
generateFakeOverrideMemberDeclarations(irClass)
generateFakeOverrideMemberDeclarations(irClass, ktClassOrObject)
if (descriptor.isData) {
generateAdditionalMembersForDataClass(irClass, ktClassOrObject)
@@ -77,7 +77,7 @@ class ClassGenerator(declarationGenerator: DeclarationGenerator) : DeclarationGe
}
}
private fun generateFakeOverrideMemberDeclarations(irClass: IrClass) {
private fun generateFakeOverrideMemberDeclarations(irClass: IrClass, ktClassOrObject: KtClassOrObject) {
irClass.descriptor.unsubstitutedMemberScope.getContributedDescriptors()
.mapNotNull {
it.safeAs<CallableMemberDescriptor>().takeIf {
@@ -86,7 +86,7 @@ class ClassGenerator(declarationGenerator: DeclarationGenerator) : DeclarationGe
}
.sortedWith(StableCallableMembersComparator)
.forEach { fakeOverride ->
irClass.addMember(declarationGenerator.generateFakeOverrideDeclaration(fakeOverride))
irClass.addMember(declarationGenerator.generateFakeOverrideDeclaration(fakeOverride, ktClassOrObject))
}
}
@@ -87,7 +87,7 @@ class DeclarationGenerator(override val context: GeneratorContext) : Generator {
fun generateInitializerBody(scopeOwnerSymbol: IrSymbol, ktBody: KtExpression): IrExpressionBody =
createBodyGenerator(scopeOwnerSymbol).generateExpressionBody(ktBody)
fun generateFakeOverrideDeclaration(memberDescriptor: CallableMemberDescriptor, ktElement: KtElement? = null): IrDeclaration {
fun generateFakeOverrideDeclaration(memberDescriptor: CallableMemberDescriptor, ktElement: KtElement): IrDeclaration {
assert(memberDescriptor.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
"Fake override expected: $memberDescriptor"
}
@@ -101,7 +101,7 @@ class DeclarationGenerator(override val context: GeneratorContext) : Generator {
}
}
private fun generateFakeOverrideProperty(propertyDescriptor: PropertyDescriptor, ktElement: KtElement?): IrProperty =
private fun generateFakeOverrideProperty(propertyDescriptor: PropertyDescriptor, ktElement: KtElement): IrProperty =
IrPropertyImpl(
ktElement.startOffsetOrUndefined, ktElement.endOffsetOrUndefined,
IrDeclarationOrigin.FAKE_OVERRIDE,
@@ -117,12 +117,8 @@ class DeclarationGenerator(override val context: GeneratorContext) : Generator {
propertyDescriptor.setter?.let { generateFakeOverrideFunction(it, ktElement) }
)
private fun generateFakeOverrideFunction(functionDescriptor: FunctionDescriptor, ktElement: KtElement?): IrFunction =
context.symbolTable.declareSimpleFunction(
ktElement.startOffsetOrUndefined, ktElement.endOffsetOrUndefined,
IrDeclarationOrigin.FAKE_OVERRIDE,
functionDescriptor
)
private fun generateFakeOverrideFunction(functionDescriptor: FunctionDescriptor, ktElement: KtElement): IrFunction =
FunctionGenerator(this).generateFakeOverrideFunction(functionDescriptor, ktElement)
}
abstract class DeclarationGeneratorExtension(val declarationGenerator: DeclarationGenerator) : Generator {
@@ -54,6 +54,14 @@ class FunctionGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
generateLambdaBody(ktFunction)
}
fun generateFakeOverrideFunction(functionDescriptor: FunctionDescriptor, ktElement: KtElement): IrFunction =
context.symbolTable.declareSimpleFunction(
ktElement.startOffsetOrUndefined, ktElement.endOffsetOrUndefined,
IrDeclarationOrigin.FAKE_OVERRIDE,
functionDescriptor
).buildWithScope { irFunction ->
generateFunctionParameterDeclarations(irFunction, ktElement, null)
}
private inline fun declareSimpleFunction(
ktFunction: KtFunction,
@@ -71,7 +79,7 @@ class FunctionGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
fun generateFunctionParameterDeclarations(
irFunction: IrFunction,
ktParameterOwner: KtElement,
ktParameterOwner: KtElement?,
ktReceiverParameterElement: KtElement?
) {
declarationGenerator.generateTypeParameterDeclarations(irFunction, irFunction.descriptor.typeParameters)