FIR: support annotation resolve & rendering

This commit is contained in:
Mikhail Glukhikh
2018-03-26 18:41:55 +03:00
parent c31513837b
commit 7279d696d2
15 changed files with 125 additions and 5 deletions
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol
@@ -353,14 +354,32 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
} }
override fun visitCall(call: FirCall) { override fun visitCall(call: FirCall) {
visitExpression(call) print("(")
call.arguments.renderSeparated()
print(")")
} }
override fun visitAnnotationCall(annotationCall: FirAnnotationCall) { override fun visitAnnotationCall(annotationCall: FirAnnotationCall) {
print("@")
annotationCall.useSiteTarget?.let {
print(it.name)
print(":")
}
annotationCall.annotationType.accept(this)
visitCall(annotationCall) visitCall(annotationCall)
if (annotationCall.useSiteTarget == AnnotationUseSiteTarget.FILE) {
println()
} else {
print(" ")
}
} }
override fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall) { override fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall) {
if (delegatedConstructorCall.isSuper) {
print(": super")
} else if (delegatedConstructorCall.isThis) {
print(": this")
}
visitCall(delegatedConstructorCall) visitCall(delegatedConstructorCall)
} }
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirCallableMember import org.jetbrains.kotlin.fir.declarations.FirCallableMember
import org.jetbrains.kotlin.fir.declarations.FirMemberPlatformStatus import org.jetbrains.kotlin.fir.declarations.FirMemberPlatformStatus
import org.jetbrains.kotlin.fir.transformInplace
import org.jetbrains.kotlin.fir.transformSingle import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirType import org.jetbrains.kotlin.fir.types.FirType
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
@@ -30,6 +31,7 @@ abstract class FirAbstractCallableMember(
) : FirAbstractMemberDeclaration(session, psi, name, visibility, modality, platformStatus), FirCallableMember { ) : FirAbstractMemberDeclaration(session, psi, name, visibility, modality, platformStatus), FirCallableMember {
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
annotations.transformInplace(transformer, data)
receiverType = receiverType?.transformSingle(transformer, data) receiverType = receiverType?.transformSingle(transformer, data)
returnType = returnType.transformSingle(transformer, data) returnType = returnType.transformSingle(transformer, data)
@@ -22,6 +22,7 @@ abstract class FirAbstractFunction(
final override val valueParameters = mutableListOf<FirValueParameter>() final override val valueParameters = mutableListOf<FirValueParameter>()
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
annotations.transformInplace(transformer, data)
valueParameters.transformInplace(transformer, data) valueParameters.transformInplace(transformer, data)
return this return this
@@ -46,6 +46,7 @@ open class FirClassImpl(
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirClass { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirClass {
annotations.transformInplace(transformer, data)
typeParameters.transformInplace(transformer, data) typeParameters.transformInplace(transformer, data)
superTypes.transformInplace(transformer, data) superTypes.transformInplace(transformer, data)
declarations.transformInplace(transformer, data) declarations.transformInplace(transformer, data)
@@ -26,6 +26,7 @@ class FirFileImpl(
override val declarations = mutableListOf<FirDeclaration>() override val declarations = mutableListOf<FirDeclaration>()
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
annotations.transformInplace(transformer, data)
imports.transformInplace(transformer, data) imports.transformInplace(transformer, data)
declarations.transformInplace(transformer, data) declarations.transformInplace(transformer, data)
return this return this
@@ -37,6 +37,7 @@ class FirTypeAliasImpl(
get() = super.modality ?: Modality.FINAL get() = super.modality ?: Modality.FINAL
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
annotations.transformInplace(transformer, data)
typeParameters.transformInplace(transformer, data) typeParameters.transformInplace(transformer, data)
expandedType = expandedType.transformSingle(transformer, data) expandedType = expandedType.transformSingle(transformer, data)
@@ -6,13 +6,22 @@
package org.jetbrains.kotlin.fir.expressions.impl package org.jetbrains.kotlin.fir.expressions.impl
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirCall import org.jetbrains.kotlin.fir.expressions.FirCall
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.transformInplace
import org.jetbrains.kotlin.fir.visitors.FirTransformer
abstract class FirAbstractCall( abstract class FirAbstractCall(
final override val session: FirSession, final override val session: FirSession,
final override val psi: PsiElement? final override val psi: PsiElement?
) : FirCall { ) : FirCall {
final override val arguments = mutableListOf<FirExpression>() final override val arguments = mutableListOf<FirExpression>()
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
arguments.transformInplace(transformer, data)
return this
}
} }
@@ -7,13 +7,22 @@ package org.jetbrains.kotlin.fir.expressions.impl
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall 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.types.FirType
import org.jetbrains.kotlin.fir.visitors.FirTransformer
class FirAnnotationCallImpl( class FirAnnotationCallImpl(
session: FirSession, session: FirSession,
psi: PsiElement?, psi: PsiElement?,
override val useSiteTarget: AnnotationUseSiteTarget?, override val useSiteTarget: AnnotationUseSiteTarget?,
override val annotationType: FirType override var annotationType: FirType
) : FirAbstractCall(session, psi), FirAnnotationCall ) : FirAbstractCall(session, psi), FirAnnotationCall {
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
annotationType = annotationType.transformSingle(transformer, data)
return super<FirAbstractCall>.transformChildren(transformer, data)
}
}
@@ -6,9 +6,12 @@
package org.jetbrains.kotlin.fir.types.impl package org.jetbrains.kotlin.fir.types.impl
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall 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.types.FirTypeWithNullability
import org.jetbrains.kotlin.fir.visitors.FirTransformer
abstract class FirAbstractAnnotatedType( abstract class FirAbstractAnnotatedType(
final override val session: FirSession, final override val session: FirSession,
@@ -16,4 +19,10 @@ abstract class FirAbstractAnnotatedType(
final override val isNullable: Boolean final override val isNullable: Boolean
) : FirTypeWithNullability { ) : FirTypeWithNullability {
override val annotations = mutableListOf<FirAnnotationCall>() override val annotations = mutableListOf<FirAnnotationCall>()
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
annotations.transformInplace(transformer, data)
return this
}
} }
@@ -29,6 +29,6 @@ class FirFunctionTypeImpl(
returnType = returnType.transformSingle(transformer, data) returnType = returnType.transformSingle(transformer, data)
valueParameters.transformInplace(transformer, data) valueParameters.transformInplace(transformer, data)
return this return super<FirAbstractAnnotatedType>.transformChildren(transformer, data)
} }
} }
@@ -26,6 +26,6 @@ class FirUserTypeImpl(
(part.typeArguments as MutableList<FirTypeProjection>).transformInplace(transformer, data) (part.typeArguments as MutableList<FirTypeProjection>).transformInplace(transformer, data)
} }
return this return super<FirAbstractAnnotatedType>.transformChildren(transformer, data)
} }
} }
@@ -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)
+28
View File
@@ -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
+24
View File
@@ -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|
@@ -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); 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") @TestMetadata("NestedSuperType.kt")
public void testNestedSuperType() throws Exception { public void testNestedSuperType() throws Exception {
runTest("compiler/testData/fir/resolve/multifile/NestedSuperType.kt"); runTest("compiler/testData/fir/resolve/multifile/NestedSuperType.kt");