Generate annotations for declarations in psi2ir

This commit is contained in:
Dmitry Petrov
2018-04-03 17:47:03 +03:00
parent c2dced775d
commit 57077a5eb8
35 changed files with 1522 additions and 45 deletions
@@ -92,6 +92,7 @@ open class DeepCopyIrTree : IrElementTransformerVoid() {
mapClassDeclaration(declaration.descriptor),
declaration.declarations.map { it.transform() }
).apply {
transformAnnotations(declaration)
thisReceiver = declaration.thisReceiver?.withDescriptor(descriptor.thisAsReceiverParameter)
transformTypeParameters(declaration, descriptor.declaredTypeParameters)
@@ -117,7 +118,9 @@ open class DeepCopyIrTree : IrElementTransformerVoid() {
declaration.startOffset, declaration.endOffset,
mapDeclarationOrigin(declaration.origin),
mapTypeAliasDeclaration(declaration.descriptor)
)
).apply {
transformAnnotations(declaration)
}
override fun visitSimpleFunction(declaration: IrSimpleFunction): IrFunction =
IrFunctionImpl(
@@ -126,6 +129,7 @@ open class DeepCopyIrTree : IrElementTransformerVoid() {
mapFunctionDeclaration(declaration.descriptor),
declaration.body?.transform()
).transformParameters(declaration).apply {
transformAnnotations(declaration)
descriptor.overriddenDescriptors.mapIndexedTo(overriddenSymbols) { index, overriddenDescriptor ->
val oldOverriddenSymbol = declaration.overriddenSymbols.getOrNull(index)
if (overriddenDescriptor.original == oldOverriddenSymbol?.descriptor?.original)
@@ -141,7 +145,9 @@ open class DeepCopyIrTree : IrElementTransformerVoid() {
mapDeclarationOrigin(declaration.origin),
mapConstructorDeclaration(declaration.descriptor),
declaration.body?.transform()
).transformParameters(declaration)
).transformParameters(declaration).apply {
transformAnnotations(declaration)
}
protected fun <T : IrTypeParametersContainer> T.transformTypeParameters(
original: T,
@@ -183,6 +189,10 @@ open class DeepCopyIrTree : IrElementTransformerVoid() {
}
}
private fun IrAnnotationContainer.transformAnnotations(original: IrAnnotationContainer) {
original.annotations.mapTo(annotations) { it.transform() }
}
protected fun copyTypeParameter(
originalTypeParameter: IrTypeParameter,
newTypeParameterDescriptor: TypeParameterDescriptor
@@ -220,7 +230,9 @@ open class DeepCopyIrTree : IrElementTransformerVoid() {
mapDeclarationOrigin(originalValueParameter.origin),
newParameterDescriptor,
originalValueParameter.defaultValue?.transform()
)
).apply {
transformAnnotations(originalValueParameter)
}
// TODO visitTypeParameter
// TODO visitValueParameter
@@ -234,7 +246,9 @@ open class DeepCopyIrTree : IrElementTransformerVoid() {
declaration.backingField?.transform(),
declaration.getter?.transform(),
declaration.setter?.transform()
)
).apply {
transformAnnotations(declaration)
}
override fun visitField(declaration: IrField): IrField =
IrFieldImpl(
@@ -242,7 +256,9 @@ open class DeepCopyIrTree : IrElementTransformerVoid() {
mapDeclarationOrigin(declaration.origin),
mapPropertyDeclaration(declaration.descriptor),
declaration.initializer?.transform()
)
).apply {
transformAnnotations(declaration)
}
override fun visitLocalDelegatedProperty(declaration: IrLocalDelegatedProperty): IrLocalDelegatedProperty =
IrLocalDelegatedPropertyImpl(
@@ -277,7 +293,9 @@ open class DeepCopyIrTree : IrElementTransformerVoid() {
mapDeclarationOrigin(declaration.origin),
mapVariableDeclaration(declaration.descriptor),
declaration.initializer?.transform()
)
).apply {
transformAnnotations(declaration)
}
override fun visitBody(body: IrBody): IrBody =
throw IllegalArgumentException("Unsupported body type: $body")
@@ -86,6 +86,7 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
mapDeclarationOrigin(declaration.origin),
symbolRemapper.getDeclaredClass(declaration.symbol)
).apply {
transformAnnotations(declaration)
declaration.superClasses.mapTo(superClasses) {
symbolRemapper.getReferencedClass(it)
}
@@ -99,7 +100,9 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
declaration.startOffset, declaration.endOffset,
mapDeclarationOrigin(declaration.origin),
declaration.descriptor
)
).apply {
transformAnnotations(declaration)
}
override fun visitSimpleFunction(declaration: IrSimpleFunction): IrSimpleFunction =
IrFunctionImpl(
@@ -124,6 +127,7 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
private fun <T : IrFunction> T.transformFunctionChildren(declaration: T): T =
apply {
transformAnnotations(declaration)
declaration.typeParameters.transformTo(typeParameters)
dispatchReceiverParameter = declaration.dispatchReceiverParameter?.transform()
extensionReceiverParameter = declaration.extensionReceiverParameter?.transform()
@@ -131,6 +135,10 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
body = declaration.body?.transform()
}
private fun IrDeclaration.transformAnnotations(declaration: IrDeclaration) {
declaration.annotations.transformTo(annotations)
}
override fun visitProperty(declaration: IrProperty): IrProperty =
IrPropertyImpl(
declaration.startOffset, declaration.endOffset,
@@ -140,7 +148,9 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
declaration.backingField?.transform(),
declaration.getter?.transform(),
declaration.setter?.transform()
)
).apply {
transformAnnotations(declaration)
}
override fun visitField(declaration: IrField): IrField =
IrFieldImpl(
@@ -148,6 +158,7 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
mapDeclarationOrigin(declaration.origin),
symbolRemapper.getDeclaredField(declaration.symbol)
).apply {
transformAnnotations(declaration)
initializer = declaration.initializer?.transform()
}
@@ -186,6 +197,7 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
mapDeclarationOrigin(declaration.origin),
symbolRemapper.getDeclaredVariable(declaration.symbol)
).apply {
transformAnnotations(declaration)
initializer = declaration.initializer?.transform()
}
@@ -206,6 +218,7 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
mapDeclarationOrigin(declaration.origin),
symbolRemapper.getDeclaredValueParameter(declaration.symbol)
).apply {
transformAnnotations(declaration)
defaultValue = declaration.defaultValue?.transform()
}
@@ -53,7 +53,12 @@ class DumpIrTreeVisitor(out: Appendable) : IrElementVisitor<Unit, String> {
}
override fun visitElement(element: IrElement, data: String) {
element.dumpLabeledSubTree(data)
element.dumpLabeledElementWith(data) {
if (element is IrAnnotationContainer) {
dumpAnnotations(element)
}
element.acceptChildren(this@DumpIrTreeVisitor, "")
}
}
override fun visitModuleFragment(declaration: IrModuleFragment, data: String) {
@@ -79,6 +84,7 @@ class DumpIrTreeVisitor(out: Appendable) : IrElementVisitor<Unit, String> {
override fun visitClass(declaration: IrClass, data: String) {
declaration.dumpLabeledElementWith(data) {
dumpAnnotations(declaration)
declaration.thisReceiver?.accept(this, "\$this")
declaration.superClasses.renderDeclarationElementsOrDescriptors("superClasses")
declaration.typeParameters.dumpElements()
@@ -88,12 +94,14 @@ class DumpIrTreeVisitor(out: Appendable) : IrElementVisitor<Unit, String> {
override fun visitTypeParameter(declaration: IrTypeParameter, data: String) {
declaration.dumpLabeledElementWith(data) {
dumpAnnotations(declaration)
declaration.superClassifiers.renderDeclarationElementsOrDescriptors("superClassifiers")
}
}
override fun visitSimpleFunction(declaration: IrSimpleFunction, data: String) {
declaration.dumpLabeledElementWith(data) {
dumpAnnotations(declaration)
declaration.overriddenSymbols.renderDeclarationElementsOrDescriptors("overridden")
declaration.typeParameters.dumpElements()
declaration.dispatchReceiverParameter?.accept(this, "\$this")
@@ -103,6 +111,14 @@ class DumpIrTreeVisitor(out: Appendable) : IrElementVisitor<Unit, String> {
}
}
private fun dumpAnnotations(element: IrAnnotationContainer) {
if (element.annotations.isNotEmpty()) {
indented("annotations") {
element.annotations.dumpElements()
}
}
}
private fun Collection<IrSymbol>.renderDeclarationElementsOrDescriptors(caption: String) {
if (isNotEmpty()) {
indented(caption) {
@@ -114,19 +130,19 @@ class DumpIrTreeVisitor(out: Appendable) : IrElementVisitor<Unit, String> {
}
private fun IrSymbol.renderDeclarationElementOrDescriptor(label: String? = null) {
if (isBound)
owner.render(label)
else {
if (label != null) {
when {
isBound ->
owner.render(label)
label != null ->
printer.println("$label: ", "UNBOUND: ", DescriptorRenderer.COMPACT.render(descriptor))
} else {
else ->
printer.println("UNBOUND: ", DescriptorRenderer.COMPACT.render(descriptor))
}
}
}
override fun visitConstructor(declaration: IrConstructor, data: String) {
declaration.dumpLabeledElementWith(data) {
dumpAnnotations(declaration)
declaration.typeParameters.dumpElements()
declaration.dispatchReceiverParameter?.accept(this, "\$outer")
declaration.valueParameters.dumpElements()
@@ -136,6 +152,7 @@ class DumpIrTreeVisitor(out: Appendable) : IrElementVisitor<Unit, String> {
override fun visitProperty(declaration: IrProperty, data: String) {
declaration.dumpLabeledElementWith(data) {
dumpAnnotations(declaration)
declaration.typeParameters.dumpElements()
declaration.backingField?.accept(this, "")
declaration.getter?.accept(this, "")
@@ -156,6 +173,7 @@ class DumpIrTreeVisitor(out: Appendable) : IrElementVisitor<Unit, String> {
override fun visitEnumEntry(declaration: IrEnumEntry, data: String) {
declaration.dumpLabeledElementWith(data) {
dumpAnnotations(declaration)
declaration.initializerExpression?.accept(this, "init")
declaration.correspondingClass?.accept(this, "class")
}