Local classes.

This commit is contained in:
Dmitry Petrov
2016-08-30 14:36:29 +03:00
committed by Dmitry Petrov
parent 41d772d636
commit dc169e98d5
5 changed files with 34 additions and 5 deletions
@@ -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 {
+6
View File
@@ -0,0 +1,6 @@
fun outer() {
class LocalClass {
fun foo() {}
}
LocalClass().foo()
}
+10
View File
@@ -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");