From 7279d696d2175867dae82e67c7b55eea01bb0823 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 26 Mar 2018 18:41:55 +0300 Subject: [PATCH] FIR: support annotation resolve & rendering --- .../org/jetbrains/kotlin/fir/FirRenderer.kt | 21 +++++++++++++- .../impl/FirAbstractCallableMember.kt | 2 ++ .../declarations/impl/FirAbstractFunction.kt | 1 + .../fir/declarations/impl/FirClassImpl.kt | 1 + .../fir/declarations/impl/FirFileImpl.kt | 1 + .../fir/declarations/impl/FirTypeAliasImpl.kt | 1 + .../fir/expressions/impl/FirAbstractCall.kt | 9 ++++++ .../expressions/impl/FirAnnotationCallImpl.kt | 13 +++++++-- .../types/impl/FirAbstractAnnotatedType.kt | 9 ++++++ .../fir/types/impl/FirFunctionTypeImpl.kt | 2 +- .../kotlin/fir/types/impl/FirUserTypeImpl.kt | 2 +- .../fir/resolve/multifile/Annotations.1.kt | 10 +++++++ .../fir/resolve/multifile/Annotations.kt | 28 +++++++++++++++++++ .../fir/resolve/multifile/Annotations.txt | 24 ++++++++++++++++ .../fir/FirResolveTestCaseGenerated.java | 6 ++++ 15 files changed, 125 insertions(+), 5 deletions(-) create mode 100644 compiler/testData/fir/resolve/multifile/Annotations.1.kt create mode 100644 compiler/testData/fir/resolve/multifile/Annotations.kt create mode 100644 compiler/testData/fir/resolve/multifile/Annotations.txt diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt index a0f9df417c8..2a54bf677ce 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibility +import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol @@ -353,14 +354,32 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() { } override fun visitCall(call: FirCall) { - visitExpression(call) + print("(") + call.arguments.renderSeparated() + print(")") } override fun visitAnnotationCall(annotationCall: FirAnnotationCall) { + print("@") + annotationCall.useSiteTarget?.let { + print(it.name) + print(":") + } + annotationCall.annotationType.accept(this) visitCall(annotationCall) + if (annotationCall.useSiteTarget == AnnotationUseSiteTarget.FILE) { + println() + } else { + print(" ") + } } override fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall) { + if (delegatedConstructorCall.isSuper) { + print(": super") + } else if (delegatedConstructorCall.isThis) { + print(": this") + } visitCall(delegatedConstructorCall) } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAbstractCallableMember.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAbstractCallableMember.kt index fb489f242a9..bf2d717d07c 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAbstractCallableMember.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAbstractCallableMember.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirCallableMember import org.jetbrains.kotlin.fir.declarations.FirMemberPlatformStatus +import org.jetbrains.kotlin.fir.transformInplace import org.jetbrains.kotlin.fir.transformSingle import org.jetbrains.kotlin.fir.types.FirType import org.jetbrains.kotlin.fir.visitors.FirTransformer @@ -30,6 +31,7 @@ abstract class FirAbstractCallableMember( ) : FirAbstractMemberDeclaration(session, psi, name, visibility, modality, platformStatus), FirCallableMember { override fun transformChildren(transformer: FirTransformer, data: D): FirElement { + annotations.transformInplace(transformer, data) receiverType = receiverType?.transformSingle(transformer, data) returnType = returnType.transformSingle(transformer, data) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAbstractFunction.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAbstractFunction.kt index cec1ce2e696..a00d4979446 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAbstractFunction.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAbstractFunction.kt @@ -22,6 +22,7 @@ abstract class FirAbstractFunction( final override val valueParameters = mutableListOf() override fun transformChildren(transformer: FirTransformer, data: D): FirElement { + annotations.transformInplace(transformer, data) valueParameters.transformInplace(transformer, data) return this diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirClassImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirClassImpl.kt index 3d2bfd58ebd..950b01070ec 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirClassImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirClassImpl.kt @@ -46,6 +46,7 @@ open class FirClassImpl( override fun transformChildren(transformer: FirTransformer, data: D): FirClass { + annotations.transformInplace(transformer, data) typeParameters.transformInplace(transformer, data) superTypes.transformInplace(transformer, data) declarations.transformInplace(transformer, data) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirFileImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirFileImpl.kt index 6c8da08576c..ec95bb8acfa 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirFileImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirFileImpl.kt @@ -26,6 +26,7 @@ class FirFileImpl( override val declarations = mutableListOf() override fun transformChildren(transformer: FirTransformer, data: D): FirElement { + annotations.transformInplace(transformer, data) imports.transformInplace(transformer, data) declarations.transformInplace(transformer, data) return this diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirTypeAliasImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirTypeAliasImpl.kt index 3f40cb0d4c6..d92a7868cf3 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirTypeAliasImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirTypeAliasImpl.kt @@ -37,6 +37,7 @@ class FirTypeAliasImpl( get() = super.modality ?: Modality.FINAL override fun transformChildren(transformer: FirTransformer, data: D): FirElement { + annotations.transformInplace(transformer, data) typeParameters.transformInplace(transformer, data) expandedType = expandedType.transformSingle(transformer, data) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractCall.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractCall.kt index 9e9c768d671..523afb1375a 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractCall.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAbstractCall.kt @@ -6,13 +6,22 @@ package org.jetbrains.kotlin.fir.expressions.impl import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.expressions.FirCall import org.jetbrains.kotlin.fir.expressions.FirExpression +import org.jetbrains.kotlin.fir.transformInplace +import org.jetbrains.kotlin.fir.visitors.FirTransformer abstract class FirAbstractCall( final override val session: FirSession, final override val psi: PsiElement? ) : FirCall { final override val arguments = mutableListOf() + + override fun transformChildren(transformer: FirTransformer, data: D): FirElement { + arguments.transformInplace(transformer, data) + + return this + } } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAnnotationCallImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAnnotationCallImpl.kt index 09c034207e0..40ec4acf256 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAnnotationCallImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAnnotationCallImpl.kt @@ -7,13 +7,22 @@ package org.jetbrains.kotlin.fir.expressions.impl import com.intellij.psi.PsiElement import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget +import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall +import org.jetbrains.kotlin.fir.transformSingle import org.jetbrains.kotlin.fir.types.FirType +import org.jetbrains.kotlin.fir.visitors.FirTransformer class FirAnnotationCallImpl( session: FirSession, psi: PsiElement?, override val useSiteTarget: AnnotationUseSiteTarget?, - override val annotationType: FirType -) : FirAbstractCall(session, psi), FirAnnotationCall \ No newline at end of file + override var annotationType: FirType +) : FirAbstractCall(session, psi), FirAnnotationCall { + override fun transformChildren(transformer: FirTransformer, data: D): FirElement { + annotationType = annotationType.transformSingle(transformer, data) + + return super.transformChildren(transformer, data) + } +} \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirAbstractAnnotatedType.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirAbstractAnnotatedType.kt index d829d4e254e..f10600b8b9c 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirAbstractAnnotatedType.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirAbstractAnnotatedType.kt @@ -6,9 +6,12 @@ package org.jetbrains.kotlin.fir.types.impl import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall +import org.jetbrains.kotlin.fir.transformInplace import org.jetbrains.kotlin.fir.types.FirTypeWithNullability +import org.jetbrains.kotlin.fir.visitors.FirTransformer abstract class FirAbstractAnnotatedType( final override val session: FirSession, @@ -16,4 +19,10 @@ abstract class FirAbstractAnnotatedType( final override val isNullable: Boolean ) : FirTypeWithNullability { override val annotations = mutableListOf() + + override fun transformChildren(transformer: FirTransformer, data: D): FirElement { + annotations.transformInplace(transformer, data) + + return this + } } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirFunctionTypeImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirFunctionTypeImpl.kt index 7930861e0fd..eff928fee19 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirFunctionTypeImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirFunctionTypeImpl.kt @@ -29,6 +29,6 @@ class FirFunctionTypeImpl( returnType = returnType.transformSingle(transformer, data) valueParameters.transformInplace(transformer, data) - return this + return super.transformChildren(transformer, data) } } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirUserTypeImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirUserTypeImpl.kt index e1ea9095772..baeb3436f00 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirUserTypeImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirUserTypeImpl.kt @@ -26,6 +26,6 @@ class FirUserTypeImpl( (part.typeArguments as MutableList).transformInplace(transformer, data) } - return this + return super.transformChildren(transformer, data) } } \ No newline at end of file diff --git a/compiler/testData/fir/resolve/multifile/Annotations.1.kt b/compiler/testData/fir/resolve/multifile/Annotations.1.kt new file mode 100644 index 00000000000..0de4b778709 --- /dev/null +++ b/compiler/testData/fir/resolve/multifile/Annotations.1.kt @@ -0,0 +1,10 @@ +package annotations + +@Target(AnnotationTarget.FILE, AnnotationTarget.FUNCTION, AnnotationTarget.TYPE, AnnotationTarget.PROPERTY_GETTER) +annotation class Simple + +annotation class WithInt(val value: Int) + +annotation class WithString(val s: String) + +annotation class Complex(val wi: WithInt, val ws: WithString) \ No newline at end of file diff --git a/compiler/testData/fir/resolve/multifile/Annotations.kt b/compiler/testData/fir/resolve/multifile/Annotations.kt new file mode 100644 index 00000000000..9e7552ecf36 --- /dev/null +++ b/compiler/testData/fir/resolve/multifile/Annotations.kt @@ -0,0 +1,28 @@ +@file:Simple +package test + +import annotations.* + +@WithInt(42) +abstract class First { + @Simple + abstract fun foo(@WithString("abc") arg: @Simple Double) + + @Complex(WithInt(7), WithString("")) + abstract val v: String +} + +@WithString("xyz") +class Second(val y: Char) : @WithInt(0) First() { + override fun foo(arg: Double) { + } + + override val v: String + @Simple get() = "" + + @WithString("constructor") + constructor(): this('\n') +} + +@WithInt(24) +typealias Third = @Simple Second \ No newline at end of file diff --git a/compiler/testData/fir/resolve/multifile/Annotations.txt b/compiler/testData/fir/resolve/multifile/Annotations.txt new file mode 100644 index 00000000000..2877974de5b --- /dev/null +++ b/compiler/testData/fir/resolve/multifile/Annotations.txt @@ -0,0 +1,24 @@ +FILE: Annotations.kt + @FILE:R|annotations/Simple|() + @R|annotations/WithInt|(STUB) public? abstract class First() { + @R|annotations/Simple|() public? abstract function foo(@WithString(STUB) arg: @R|annotations/Simple|() R|kotlin/Double|): R|error: Not supported: FirImplicitTypeImpl| + + @R|annotations/Complex|(STUB, STUB) public? abstract property v(val): R|kotlin/String| + public? get(): R|kotlin/String| + + } + @R|annotations/WithString|(STUB) public? final class Second() : @R|annotations/WithInt|(STUB) R|test/First| { + public? constructor(y: R|kotlin/Char|): super() + + public? open? override function foo(arg: R|kotlin/Double|): R|error: Not supported: FirImplicitTypeImpl| { + } + + public? open? override property v(val): R|kotlin/String| + @R|annotations/Simple|() public? get(): R|error: Not supported: FirImplicitTypeImpl| { + STUB + } + + @R|annotations/WithString|(STUB) public? constructor(): this(STUB) + + } + @R|annotations/WithInt|(STUB) @R|annotations/WithInt|(STUB) public? final typealias Third = @R|annotations/Simple|() R|test/Second| diff --git a/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java b/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java index c53a8aa4819..6ee45486bd2 100644 --- a/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java @@ -121,6 +121,12 @@ public class FirResolveTestCaseGenerated extends AbstractFirResolveTestCase { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/fir/resolve/multifile"), Pattern.compile("^([^.]+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("Annotations.kt") + public void testAnnotations() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/fir/resolve/multifile/Annotations.kt"); + doTest(fileName); + } + @TestMetadata("NestedSuperType.kt") public void testNestedSuperType() throws Exception { runTest("compiler/testData/fir/resolve/multifile/NestedSuperType.kt");