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
@@ -21,7 +21,7 @@ import com.intellij.psi.PsiConstantEvaluationHelper
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiExpression
import com.intellij.psi.impl.ConstantExpressionEvaluator
import org.jetbrains.kotlin.asJava.elements.KtLightAnnotation
import org.jetbrains.kotlin.asJava.elements.KtLightAnnotationForSourceEntry
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
import org.jetbrains.kotlin.idea.project.languageVersionSettings
import org.jetbrains.kotlin.psi.KtExpression
@@ -49,7 +49,7 @@ class KotlinLightConstantExpressionEvaluator : ConstantExpressionEvaluator {
throwExceptionOnOverflow: Boolean,
auxEvaluator: PsiConstantEvaluationHelper.AuxEvaluator?
): Any? {
if (expression !is KtLightAnnotation.LightExpressionValue<*>) return null
if (expression !is KtLightAnnotationForSourceEntry.LightExpressionValue<*>) return null
val expressionToCompute = expression.originalExpression ?: return null
return when (expressionToCompute) {
is KtExpression -> {
@@ -471,7 +471,7 @@ private fun copyModifierListItems(from: PsiModifierList, to: PsiModifierList, wi
}
}
for (annotation in from.annotations) {
val annotationName = annotation.qualifiedName!!
val annotationName = annotation.qualifiedName ?: continue
if (Retention::class.java.name != annotationName) {
to.addAnnotation(annotationName)