Local classes.
This commit is contained in:
committed by
Dmitry Petrov
parent
41d772d636
commit
dc169e98d5
+9
-5
@@ -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)
|
||||
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
fun outer() {
|
||||
class LocalClass {
|
||||
fun foo() {}
|
||||
}
|
||||
LocalClass().foo()
|
||||
}
|
||||
@@ -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 .<init> type=outer.LocalClass operator=null
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user