KtLightElements: make light annotations lazier

Allow to get annotation list and to invoke `findAnnotation` without building delegate
Introduce KtLightNullabilityAnnotation which holds nullability information and is built
    before delegate is built
This commit is contained in:
Pavel V. Talanov
2017-04-24 17:37:58 +03:00
parent 03b68666e4
commit 0571c62943
25 changed files with 411 additions and 179 deletions
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.annotation.processing
import com.intellij.psi.*
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.asJava.elements.KtLightAnnotation
import org.jetbrains.kotlin.asJava.findFacadeClass
import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
@@ -6,6 +6,7 @@ public final class Test {
@org.jetbrains.annotations.NotNull
public final java.lang.String getF()
@org.jetbrains.annotations.NotNull
@org.jetbrains.annotations.NotNull
public final void a()
@@ -20,7 +20,7 @@ import com.intellij.psi.*
import com.intellij.psi.PsiModifier.*
import com.intellij.psi.impl.PsiSubstitutorImpl
import com.intellij.psi.util.PsiTypesUtil
import org.jetbrains.kotlin.asJava.elements.KtLightAnnotation
import org.jetbrains.kotlin.asJava.elements.KtLightAnnotationForSourceEntry
import javax.lang.model.element.Modifier
private val HAS_DEFAULT by lazy {
@@ -54,7 +54,7 @@ private fun PsiModifierList.getJavaModifiers(): Set<Modifier> {
internal fun PsiExpression.calcConstantValue(evaluator: PsiConstantEvaluationHelper? = null): Any? {
return when (this) {
is PsiLiteral -> value
is KtLightAnnotation.LightExpressionValue<*> -> getConstantValue() ?: delegate.calcConstantValue(evaluator)
is KtLightAnnotationForSourceEntry.LightExpressionValue<*> -> getConstantValue() ?: delegate.calcConstantValue(evaluator)
is PsiExpression -> (evaluator ?: getConstantEvaluator(this)).computeConstantExpression(this)
else -> null
}
@@ -71,7 +71,7 @@ internal val PsiModifierListOwner.isFinal: Boolean
fun PsiModifierListOwner.getJavaModifiers() = modifierList?.getJavaModifiers() ?: emptySet()
fun PsiModifierListOwner.getAnnotationsWithInherited(): List<PsiAnnotation> {
val annotations = modifierList?.annotations?.toMutableList() ?: mutableListOf()
val annotations = modifierList?.annotations?.filter { it.qualifiedName != null }?.toMutableList() ?: mutableListOf()
if (this is PsiClass) {
var superClass = superClass
@@ -229,7 +229,7 @@ internal object KotlinConverter {
is KtContainerNode -> element.getExpression()?.let {
KotlinConverter.convertExpression(it, parentCallback, requiredType)
} ?: el<UExpression> { UastEmptyExpression }
is KtLightAnnotation.LightExpressionValue<*> -> {
is KtLightAnnotationForSourceEntry.LightExpressionValue<*> -> {
val expression = element.originalExpression
when (expression) {
is KtExpression -> KotlinConverter.convertExpression(expression, parentCallback, requiredType)