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.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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
@@ -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)
|
||||||
|
|
||||||
|
|||||||
+1
@@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+11
-2
@@ -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)
|
||||||
@@ -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);
|
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");
|
||||||
|
|||||||
Reference in New Issue
Block a user