JavaSymbolProvider: support different kinds of literals in annotations

Constants, enum entries, class references, arrays are covered here
Related to KT-29218
This commit is contained in:
Mikhail Glukhikh
2019-02-14 17:17:23 +03:00
parent f8e165dbe4
commit 74d89b1be2
7 changed files with 131 additions and 7 deletions
@@ -841,6 +841,14 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
visitCall(getClassCall)
}
override fun visitClassReferenceExpression(classReferenceExpression: FirClassReferenceExpression) {
classReferenceExpression.annotations.renderAnnotations()
print("<getClass>")
print("(")
classReferenceExpression.typeRef.accept(this)
print(")")
}
override fun visitArrayOfCall(arrayOfCall: FirArrayOfCall) {
arrayOfCall.annotations.renderAnnotations()
print("<implicitArrayOf>")
@@ -0,0 +1,16 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirClassReferenceExpression : FirExpression {
val typeRef: FirTypeRef
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitClassReferenceExpression(this, data)
}
@@ -0,0 +1,25 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
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.FirClassReferenceExpression
import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.FirTransformer
class FirClassReferenceExpressionImpl(
session: FirSession,
psi: PsiElement?,
override var typeRef: FirTypeRef
) : FirAbstractExpression(session, psi), FirClassReferenceExpression {
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
typeRef = typeRef.transformSingle(transformer, data)
return super<FirAbstractExpression>.transformChildren(transformer, data)
}
}
@@ -220,6 +220,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformOperatorCall(typeOperatorCall, data)
}
open fun transformClassReferenceExpression(classReferenceExpression: FirClassReferenceExpression, data: D): CompositeTransformResult<FirStatement> {
return transformExpression(classReferenceExpression, data)
}
open fun <T> transformConstExpression(constExpression: FirConstExpression<T>, data: D): CompositeTransformResult<FirStatement> {
return transformExpression(constExpression, data)
}
@@ -416,6 +420,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformClass(klass, data)
}
final override fun visitClassReferenceExpression(classReferenceExpression: FirClassReferenceExpression, data: D): CompositeTransformResult<FirElement> {
return transformClassReferenceExpression(classReferenceExpression, data)
}
final override fun visitComponentCall(componentCall: FirComponentCall, data: D): CompositeTransformResult<FirElement> {
return transformComponentCall(componentCall, data)
}
@@ -220,6 +220,10 @@ abstract class FirVisitor<out R, in D> {
return visitOperatorCall(typeOperatorCall, data)
}
open fun visitClassReferenceExpression(classReferenceExpression: FirClassReferenceExpression, data: D): R {
return visitExpression(classReferenceExpression, data)
}
open fun <T> visitConstExpression(constExpression: FirConstExpression<T>, data: D): R {
return visitExpression(constExpression, data)
}
@@ -220,6 +220,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitOperatorCall(typeOperatorCall, null)
}
open fun visitClassReferenceExpression(classReferenceExpression: FirClassReferenceExpression) {
visitExpression(classReferenceExpression, null)
}
open fun <T> visitConstExpression(constExpression: FirConstExpression<T>) {
visitExpression(constExpression, null)
}
@@ -416,6 +420,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitClass(klass)
}
final override fun visitClassReferenceExpression(classReferenceExpression: FirClassReferenceExpression, data: Nothing?) {
visitClassReferenceExpression(classReferenceExpression)
}
final override fun visitComponentCall(componentCall: FirComponentCall, data: Nothing?) {
visitComponentCall(componentCall)
}