diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/LocalClassGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/LocalClassGenerator.kt index b2713ab6655..f3b0703bb29 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/LocalClassGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/LocalClassGenerator.kt @@ -20,16 +20,17 @@ import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.expressions.IrBlockImpl import org.jetbrains.kotlin.ir.expressions.IrCallImpl import org.jetbrains.kotlin.ir.expressions.IrOperator +import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtObjectLiteralExpression import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.psi.psiUtil.startOffset class LocalClassGenerator(statementGenerator: StatementGenerator): StatementGeneratorExtension(statementGenerator) { - fun generateObjectLiteral(expression: KtObjectLiteralExpression): IrStatement { - val objectLiteralType = getInferredTypeWithImplicitCastsOrFail(expression) - val irBlock = IrBlockImpl(expression.startOffset, expression.endOffset, objectLiteralType, IrOperator.OBJECT_LITERAL) + fun generateObjectLiteral(ktObjectLiteral: KtObjectLiteralExpression): IrStatement { + val objectLiteralType = getInferredTypeWithImplicitCastsOrFail(ktObjectLiteral) + val irBlock = IrBlockImpl(ktObjectLiteral.startOffset, ktObjectLiteral.endOffset, objectLiteralType, IrOperator.OBJECT_LITERAL) - val irClass = DeclarationGenerator(statementGenerator.context).generateClassOrObjectDeclaration(expression.objectDeclaration) + val irClass = DeclarationGenerator(statementGenerator.context).generateClassOrObjectDeclaration(ktObjectLiteral.objectDeclaration) irBlock.addStatement(irClass) val objectConstructor = irClass.descriptor.unsubstitutedPrimaryConstructor ?: @@ -44,10 +45,13 @@ class LocalClassGenerator(statementGenerator: StatementGenerator): StatementGene "Object literal constructor should have no value parameters: $objectConstructor" } - irBlock.addStatement(IrCallImpl(expression.startOffset, expression.endOffset, objectLiteralType, + irBlock.addStatement(IrCallImpl(ktObjectLiteral.startOffset, ktObjectLiteral.endOffset, objectLiteralType, objectConstructor, IrOperator.OBJECT_LITERAL)) return irBlock } + fun generateLocalClass(ktClassOrObject: KtClassOrObject): IrStatement = + DeclarationGenerator(statementGenerator.context).generateClassOrObjectDeclaration(ktClassOrObject) + } diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StatementGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StatementGenerator.kt index e2d019f6267..4a961cf00bb 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StatementGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StatementGenerator.kt @@ -339,6 +339,9 @@ class StatementGenerator( override fun visitObjectLiteralExpression(expression: KtObjectLiteralExpression, data: Nothing?): IrStatement = LocalClassGenerator(this).generateObjectLiteral(expression) + + override fun visitClassOrObject(classOrObject: KtClassOrObject, data: Nothing?): IrStatement = + LocalClassGenerator(this).generateLocalClass(classOrObject) } abstract class StatementGeneratorExtension(val statementGenerator: StatementGenerator) : GeneratorWithScope { diff --git a/compiler/testData/ir/irText/classes/localClasses.kt b/compiler/testData/ir/irText/classes/localClasses.kt new file mode 100644 index 00000000000..88a307cb76a --- /dev/null +++ b/compiler/testData/ir/irText/classes/localClasses.kt @@ -0,0 +1,6 @@ +fun outer() { + class LocalClass { + fun foo() {} + } + LocalClass().foo() +} \ No newline at end of file diff --git a/compiler/testData/ir/irText/classes/localClasses.txt b/compiler/testData/ir/irText/classes/localClasses.txt new file mode 100644 index 00000000000..f5aefc751e9 --- /dev/null +++ b/compiler/testData/ir/irText/classes/localClasses.txt @@ -0,0 +1,10 @@ +FILE /localClasses.kt + FUN public fun outer(): kotlin.Unit + BLOCK_BODY + CLASS CLASS LocalClass + FUN public constructor LocalClass() + BLOCK_BODY + FUN public final fun foo(): kotlin.Unit + BLOCK_BODY + CALL .foo type=kotlin.Unit operator=null + $this: CALL . type=outer.LocalClass operator=null diff --git a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java index a45e0aa3754..75545fc8021 100644 --- a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java @@ -85,6 +85,12 @@ public class IrTextTestCaseGenerated extends AbstractIrTextTestCase { doTest(fileName); } + @TestMetadata("localClasses.kt") + public void testLocalClasses() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/classes/localClasses.kt"); + doTest(fileName); + } + @TestMetadata("objectLiteralExpressions.kt") public void testObjectLiteralExpressions() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/classes/objectLiteralExpressions.kt");