Introduce AnnotationDescriptor.fqName

Could be used instead of ".annotationClass.fqName" to avoid the unneeded
resolution of the annotation class descriptor
This commit is contained in:
Alexander Udalov
2017-07-04 15:21:52 +03:00
parent 1d64b61a8f
commit 41ea0e8ef8
18 changed files with 48 additions and 105 deletions
@@ -22,15 +22,13 @@ import org.jetbrains.kotlin.psi.KtAnnotationEntry
import org.jetbrains.kotlin.resolve.AdditionalAnnotationChecker
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.BindingTrace
import org.jetbrains.kotlin.resolve.descriptorUtil.annotationClass
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
object JsQualifierChecker : AdditionalAnnotationChecker {
override fun checkEntries(entries: List<KtAnnotationEntry>, actualTargets: List<KotlinTarget>, trace: BindingTrace) {
val bindingContext = trace.bindingContext
for (entry in entries) {
val annotation = bindingContext[BindingContext.ANNOTATION, entry] ?: continue
if (annotation.annotationClass?.fqNameSafe != AnnotationsUtils.JS_QUALIFIER_ANNOTATION) continue
if (annotation.fqName != AnnotationsUtils.JS_QUALIFIER_ANNOTATION) continue
val argument = annotation.allValueArguments.values.singleOrNull()?.value as? String ?: continue
if (!validateQualifier(argument)) {
val argumentPsi = entry.valueArgumentList!!.arguments[0]
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.js.translate.utils;
import com.intellij.psi.PsiFile;
import kotlin.collections.CollectionsKt;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.descriptors.*;
@@ -25,7 +26,6 @@ import org.jetbrains.kotlin.descriptors.annotations.AnnotationWithTarget;
import org.jetbrains.kotlin.descriptors.annotations.Annotations;
import org.jetbrains.kotlin.js.PredefinedAnnotation;
import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.name.FqNameUnsafe;
import org.jetbrains.kotlin.psi.KtAnnotationEntry;
import org.jetbrains.kotlin.psi.KtFile;
import org.jetbrains.kotlin.resolve.BindingContext;
@@ -38,7 +38,6 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt.getAnnotationClass;
import static org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt.isEffectivelyExternal;
public final class AnnotationsUtils {
@@ -221,11 +220,7 @@ public final class AnnotationsUtils {
@NotNull FqName annotationFqName
) {
for (AnnotationDescriptor annotation : getContainingFileAnnotations(bindingContext, declaration)) {
DeclarationDescriptor annotationType = getAnnotationClass(annotation);
if (annotationType == null) continue;
FqNameUnsafe fqName = DescriptorUtils.getFqName(annotationType);
if (fqName.equals(annotationFqName.toUnsafe())) {
if (annotationFqName.equals(annotation.getFqName())) {
return extractSingleStringArgument(annotation);
}
}
@@ -237,20 +232,9 @@ public final class AnnotationsUtils {
}
public static boolean isFromNonModuleFile(@NotNull BindingContext bindingContext, @NotNull DeclarationDescriptor declaration) {
for (AnnotationDescriptor annotation : getContainingFileAnnotations(bindingContext, declaration)) {
DeclarationDescriptor annotationType = getAnnotationClass(annotation);
if (annotationType == null) continue;
DeclarationDescriptor annotationTypeDescriptor = getAnnotationClass(annotation);
assert annotationTypeDescriptor != null : "Annotation type should have descriptor: " + annotation.getType();
FqNameUnsafe fqName = DescriptorUtils.getFqName(annotationTypeDescriptor);
if (fqName.equals(JS_NON_MODULE_ANNOTATION.toUnsafe())) {
return true;
}
}
return false;
return CollectionsKt.any(getContainingFileAnnotations(bindingContext, declaration), annotation ->
JS_NON_MODULE_ANNOTATION.equals(annotation.getFqName())
);
}
@Nullable