FIR: support annotation resolve & rendering
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
+2
@@ -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 <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
|
||||
annotations.transformInplace(transformer, data)
|
||||
receiverType = receiverType?.transformSingle(transformer, data)
|
||||
returnType = returnType.transformSingle(transformer, data)
|
||||
|
||||
|
||||
+1
@@ -22,6 +22,7 @@ abstract class FirAbstractFunction(
|
||||
final override val valueParameters = mutableListOf<FirValueParameter>()
|
||||
|
||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
|
||||
annotations.transformInplace(transformer, data)
|
||||
valueParameters.transformInplace(transformer, data)
|
||||
|
||||
return this
|
||||
|
||||
@@ -46,6 +46,7 @@ open class FirClassImpl(
|
||||
|
||||
|
||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirClass {
|
||||
annotations.transformInplace(transformer, data)
|
||||
typeParameters.transformInplace(transformer, data)
|
||||
superTypes.transformInplace(transformer, data)
|
||||
declarations.transformInplace(transformer, data)
|
||||
|
||||
@@ -26,6 +26,7 @@ class FirFileImpl(
|
||||
override val declarations = mutableListOf<FirDeclaration>()
|
||||
|
||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
|
||||
annotations.transformInplace(transformer, data)
|
||||
imports.transformInplace(transformer, data)
|
||||
declarations.transformInplace(transformer, data)
|
||||
return this
|
||||
|
||||
@@ -37,6 +37,7 @@ class FirTypeAliasImpl(
|
||||
get() = super.modality ?: Modality.FINAL
|
||||
|
||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
|
||||
annotations.transformInplace(transformer, data)
|
||||
typeParameters.transformInplace(transformer, data)
|
||||
expandedType = expandedType.transformSingle(transformer, data)
|
||||
|
||||
|
||||
@@ -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<FirExpression>()
|
||||
|
||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
|
||||
arguments.transformInplace(transformer, data)
|
||||
|
||||
return this
|
||||
}
|
||||
}
|
||||
+11
-2
@@ -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
|
||||
override var annotationType: FirType
|
||||
) : 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
|
||||
|
||||
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<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)
|
||||
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)
|
||||
}
|
||||
|
||||
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)
|
||||
@@ -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
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@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");
|
||||
|
||||
Reference in New Issue
Block a user