Store file-level annotations in IrFile (should be on some descriptor, really).

This commit is contained in:
Dmitry Petrov
2016-09-07 14:25:17 +03:00
committed by Dmitry Petrov
parent e23325b014
commit 4e270ef487
6 changed files with 53 additions and 2 deletions
@@ -33,9 +33,12 @@ class ModuleGenerator(override val context: GeneratorContext) : Generator {
val irFile = IrFileImpl(fileEntry, fileName, packageFragmentDescriptor) val irFile = IrFileImpl(fileEntry, fileName, packageFragmentDescriptor)
context.sourceManager.putFileEntry(irFile, fileEntry) context.sourceManager.putFileEntry(irFile, fileEntry)
for (ktAnnotationEntry in ktFile.annotationEntries) {
irFile.addAnnotation(getOrFail(BindingContext.ANNOTATION, ktAnnotationEntry))
}
for (ktDeclaration in ktFile.declarations) { for (ktDeclaration in ktFile.declarations) {
val irDeclaration = irDeclarationGenerator.generateMemberDeclaration(ktDeclaration) irFile.addDeclaration(irDeclarationGenerator.generateMemberDeclaration(ktDeclaration))
irFile.addDeclaration(irDeclaration)
} }
irModule.addFile(irFile) irModule.addFile(irFile)
@@ -17,13 +17,16 @@
package org.jetbrains.kotlin.ir.declarations package org.jetbrains.kotlin.ir.declarations
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.kotlin.ir.* import org.jetbrains.kotlin.ir.*
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
import org.jetbrains.kotlin.utils.SmartList
import java.util.* import java.util.*
interface IrFile : IrElement { interface IrFile : IrElement {
val name: String val name: String
val fileEntry: SourceLocationManager.FileEntry val fileEntry: SourceLocationManager.FileEntry
val fileAnnotations: List<AnnotationDescriptor>
val packageFragmentDescriptor: PackageFragmentDescriptor val packageFragmentDescriptor: PackageFragmentDescriptor
val declarations: List<IrDeclaration> val declarations: List<IrDeclaration>
} }
@@ -33,6 +36,12 @@ class IrFileImpl(
override val name: String, override val name: String,
override val packageFragmentDescriptor: PackageFragmentDescriptor override val packageFragmentDescriptor: PackageFragmentDescriptor
) : IrElementBase(0, fileEntry.maxOffset), IrFile { ) : IrElementBase(0, fileEntry.maxOffset), IrFile {
override val fileAnnotations: MutableList<AnnotationDescriptor> = SmartList()
fun addAnnotation(annotation: AnnotationDescriptor) {
fileAnnotations.add(annotation)
}
override val declarations: MutableList<IrDeclaration> = ArrayList() override val declarations: MutableList<IrDeclaration> = ArrayList()
fun addDeclaration(declaration: IrDeclaration) { fun addDeclaration(declaration: IrDeclaration) {
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
import org.jetbrains.kotlin.renderer.DescriptorRenderer
import org.jetbrains.kotlin.utils.Printer import org.jetbrains.kotlin.utils.Printer
fun IrElement.dump(): String { fun IrElement.dump(): String {
@@ -41,10 +42,28 @@ class DumpIrTreeVisitor(out: Appendable): IrElementVisitor<Unit, String> {
val printer = Printer(out, " ") val printer = Printer(out, " ")
val elementRenderer = RenderIrElementVisitor() val elementRenderer = RenderIrElementVisitor()
companion object {
val ANNOTATIONS_RENDERER = DescriptorRenderer.withOptions { verbose = true }
}
override fun visitElement(element: IrElement, data: String) { override fun visitElement(element: IrElement, data: String) {
element.dumpLabeledSubTree(data) 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) { override fun visitFunction(declaration: IrFunction, data: String) {
visitFunctionWithParameters(declaration, data) visitFunctionWithParameters(declaration, data)
} }
@@ -0,0 +1,6 @@
// WITH_RUNTIME
@file:JvmName("FileWithAnnotations")
fun foo() {}
val bar = 42
@@ -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'
@@ -202,6 +202,12 @@ public class IrTextTestCaseGenerated extends AbstractIrTextTestCase {
doTest(fileName); 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") @TestMetadata("localDelegatedProperties.kt")
public void testLocalDelegatedProperties() throws Exception { public void testLocalDelegatedProperties() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/declarations/localDelegatedProperties.kt"); String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/declarations/localDelegatedProperties.kt");