From 4e270ef48747d6394e49fc4fae77fd52c2b8fb6e Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Wed, 7 Sep 2016 14:25:17 +0300 Subject: [PATCH] Store file-level annotations in IrFile (should be on some descriptor, really). --- .../psi2ir/generators/ModuleGenerator.kt | 7 +++++-- .../kotlin/ir/declarations/IrFile.kt | 9 +++++++++ .../jetbrains/kotlin/ir/util/DumpIrTree.kt | 19 +++++++++++++++++++ .../declarations/fileWithAnnotations.kt | 6 ++++++ .../declarations/fileWithAnnotations.txt | 8 ++++++++ .../kotlin/ir/IrTextTestCaseGenerated.java | 6 ++++++ 6 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/ir/irText/declarations/fileWithAnnotations.kt create mode 100644 compiler/testData/ir/irText/declarations/fileWithAnnotations.txt diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ModuleGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ModuleGenerator.kt index 7c1981e05d4..ae0a5ed5d44 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ModuleGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ModuleGenerator.kt @@ -33,9 +33,12 @@ class ModuleGenerator(override val context: GeneratorContext) : Generator { val irFile = IrFileImpl(fileEntry, fileName, packageFragmentDescriptor) context.sourceManager.putFileEntry(irFile, fileEntry) + for (ktAnnotationEntry in ktFile.annotationEntries) { + irFile.addAnnotation(getOrFail(BindingContext.ANNOTATION, ktAnnotationEntry)) + } + for (ktDeclaration in ktFile.declarations) { - val irDeclaration = irDeclarationGenerator.generateMemberDeclaration(ktDeclaration) - irFile.addDeclaration(irDeclaration) + irFile.addDeclaration(irDeclarationGenerator.generateMemberDeclaration(ktDeclaration)) } irModule.addFile(irFile) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFile.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFile.kt index c16ca2d2dad..3f1a4511bfd 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFile.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFile.kt @@ -17,13 +17,16 @@ package org.jetbrains.kotlin.ir.declarations import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor +import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor import org.jetbrains.kotlin.ir.* import org.jetbrains.kotlin.ir.visitors.IrElementVisitor +import org.jetbrains.kotlin.utils.SmartList import java.util.* interface IrFile : IrElement { val name: String val fileEntry: SourceLocationManager.FileEntry + val fileAnnotations: List val packageFragmentDescriptor: PackageFragmentDescriptor val declarations: List } @@ -33,6 +36,12 @@ class IrFileImpl( override val name: String, override val packageFragmentDescriptor: PackageFragmentDescriptor ) : IrElementBase(0, fileEntry.maxOffset), IrFile { + override val fileAnnotations: MutableList = SmartList() + + fun addAnnotation(annotation: AnnotationDescriptor) { + fileAnnotations.add(annotation) + } + override val declarations: MutableList = ArrayList() fun addDeclaration(declaration: IrDeclaration) { diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DumpIrTree.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DumpIrTree.kt index 74df6ff56be..2c210128fc1 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DumpIrTree.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DumpIrTree.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid +import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.utils.Printer fun IrElement.dump(): String { @@ -41,10 +42,28 @@ class DumpIrTreeVisitor(out: Appendable): IrElementVisitor { val printer = Printer(out, " ") val elementRenderer = RenderIrElementVisitor() + companion object { + val ANNOTATIONS_RENDERER = DescriptorRenderer.withOptions { verbose = true } + } + override fun visitElement(element: IrElement, data: String) { element.dumpLabeledSubTree(data) } + override fun visitFile(declaration: IrFile, data: String) { + declaration.dumpLabeledElementWith(data) { + if (declaration.fileAnnotations.isNotEmpty()) { + printer.println("fileAnnotations:") + indented { + declaration.fileAnnotations.forEach { + printer.println(ANNOTATIONS_RENDERER.renderAnnotation(it)) + } + } + } + declaration.declarations.forEach { it.accept(this, "") } + } + } + override fun visitFunction(declaration: IrFunction, data: String) { visitFunctionWithParameters(declaration, data) } diff --git a/compiler/testData/ir/irText/declarations/fileWithAnnotations.kt b/compiler/testData/ir/irText/declarations/fileWithAnnotations.kt new file mode 100644 index 00000000000..9a773aa6858 --- /dev/null +++ b/compiler/testData/ir/irText/declarations/fileWithAnnotations.kt @@ -0,0 +1,6 @@ +// WITH_RUNTIME +@file:JvmName("FileWithAnnotations") + +fun foo() {} + +val bar = 42 \ No newline at end of file diff --git a/compiler/testData/ir/irText/declarations/fileWithAnnotations.txt b/compiler/testData/ir/irText/declarations/fileWithAnnotations.txt new file mode 100644 index 00000000000..8f3bfc84a32 --- /dev/null +++ b/compiler/testData/ir/irText/declarations/fileWithAnnotations.txt @@ -0,0 +1,8 @@ +FILE /fileWithAnnotations.kt + fileAnnotations: + @kotlin.jvm.JvmName(name = "FileWithAnnotations") + FUN public fun foo(): kotlin.Unit + BLOCK_BODY + PROPERTY public val bar: kotlin.Int = 42 + EXPRESSION_BODY + CONST Int type=kotlin.Int value='42' diff --git a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java index 14fba26a0f7..84c158091f3 100644 --- a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java @@ -202,6 +202,12 @@ public class IrTextTestCaseGenerated extends AbstractIrTextTestCase { doTest(fileName); } + @TestMetadata("fileWithAnnotations.kt") + public void testFileWithAnnotations() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/declarations/fileWithAnnotations.kt"); + doTest(fileName); + } + @TestMetadata("localDelegatedProperties.kt") public void testLocalDelegatedProperties() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/declarations/localDelegatedProperties.kt");