[codeInsight] IDEA-238740 Support the jdk.internal.PreviewFeature annotation

This patch removes the expensive AST operations in reading PreviewFeature with PSI operations.

Signed-off-by: Nikita Eshkeev <nikita.eshkeev@jetbrains.com>

GitOrigin-RevId: 79e3110b6b7c5271910ffb0b161e7324316a09a3
This commit is contained in:
Nikita Eshkeev
2020-06-22 13:29:26 +03:00
committed by intellij-monorepo-bot
parent a3974208c6
commit 67d70b082a
2 changed files with 21 additions and 15 deletions

View File

@@ -1,15 +1,11 @@
// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.codeInsight.daemon.impl.analysis;
import com.intellij.codeInsight.AnnotationUtil;
import com.intellij.codeInsight.daemon.JavaErrorBundle;
import com.intellij.java.analysis.JavaAnalysisBundle;
import com.intellij.lang.jvm.JvmEnumField;
import com.intellij.lang.jvm.annotation.JvmAnnotationAttribute;
import com.intellij.lang.jvm.annotation.JvmAnnotationAttributeValue;
import com.intellij.lang.jvm.annotation.JvmAnnotationEnumFieldValue;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.PsiAnnotation;
import com.intellij.psi.PsiElement;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiUtil;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
@@ -107,19 +103,16 @@ public enum HighlightingFeature {
if (annotation == null) return null;
if (!annotation.hasQualifiedName(JDK_INTERNAL_PREVIEW_FEATURE)) return null;
final JvmAnnotationAttribute feature = annotation.findAttribute("feature");
final PsiNameValuePair feature = AnnotationUtil.getAttribute(annotation, "feature");
if (feature == null) return null;
final JvmAnnotationAttributeValue attributeValue = feature.getAttributeValue();
if (attributeValue == null) return null;
final PsiReferenceExpression referenceExpression = tryCast(feature.getDetachedValue(), PsiReferenceExpression.class);
if (referenceExpression == null) return null;
final JvmAnnotationEnumFieldValue annotationEnumFieldValue = tryCast(attributeValue, JvmAnnotationEnumFieldValue.class);
if (annotationEnumFieldValue == null) return null;
final PsiEnumConstant enumConstant = tryCast(referenceExpression.resolve(), PsiEnumConstant.class);
if (enumConstant == null) return null;
final JvmEnumField field = annotationEnumFieldValue.getField();
if (field == null) return null;
return convertFromPreviewFeatureName(field.getName());
return convertFromPreviewFeatureName(enumConstant.getName());
}
@Nullable

View File

@@ -302,6 +302,19 @@ public class AnnotationUtil {
return result.get();
}
/**
* Get an attribute as an instance of {@link PsiNameValuePair} by its name from the annotation
* @param annotation annotation to look for the attribute
* @param attributeName attribute name
* @return an attribute as an instance of {@link PsiNameValuePair} or null
*/
@Nullable
@Contract(pure = true)
public static PsiNameValuePair getAttribute(@NotNull final PsiAnnotation annotation, @NotNull final String attributeName) {
final PsiNameValuePair @NotNull [] attrs = annotation.getParameterList().getAttributes();
return ContainerUtil.find(attrs, a -> attributeName.equals(a.getAttributeName()));
}
@MagicConstant(flags = {CHECK_HIERARCHY, CHECK_EXTERNAL, CHECK_INFERRED, CHECK_TYPE})
@Target({ElementType.PARAMETER, ElementType.METHOD})
private @interface Flags { }