mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
Magic constant inspection
This commit is contained in:
@@ -87,7 +87,7 @@ public class AnnotationUtil {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static PsiAnnotation findAnnotation(PsiModifierListOwner listOwner, @NotNull Set<String> annotationNames) {
|
||||
public static PsiAnnotation findAnnotation(@Nullable PsiModifierListOwner listOwner, @NotNull Set<String> annotationNames) {
|
||||
return findAnnotation(listOwner, (Collection<String>)annotationNames);
|
||||
}
|
||||
|
||||
@@ -97,7 +97,7 @@ public class AnnotationUtil {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static PsiAnnotation findAnnotation(@Nullable PsiModifierListOwner listOwner, Collection<String> annotationNames,
|
||||
public static PsiAnnotation findAnnotation(@Nullable PsiModifierListOwner listOwner, @NotNull Collection<String> annotationNames,
|
||||
final boolean skipExternal) {
|
||||
if (listOwner == null) return null;
|
||||
final PsiModifierList list = listOwner.getModifierList();
|
||||
@@ -138,7 +138,7 @@ public class AnnotationUtil {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static PsiAnnotation findAnnotationInHierarchy(PsiModifierListOwner listOwner, Set<String> annotationNames) {
|
||||
public static PsiAnnotation findAnnotationInHierarchy(PsiModifierListOwner listOwner, @NotNull Set<String> annotationNames) {
|
||||
PsiAnnotation directAnnotation = findAnnotation(listOwner, annotationNames);
|
||||
if (directAnnotation != null) return directAnnotation;
|
||||
if (listOwner instanceof PsiMethod) {
|
||||
@@ -146,15 +146,17 @@ public class AnnotationUtil {
|
||||
PsiClass aClass = method.getContainingClass();
|
||||
if (aClass == null) return null;
|
||||
HierarchicalMethodSignature methodSignature = method.getHierarchicalMethodSignature();
|
||||
return findAnnotationInHierarchy(methodSignature, annotationNames, method, null);
|
||||
} else if (listOwner instanceof PsiClass) {
|
||||
return findAnnotationInHierarchy(((PsiClass)listOwner), annotationNames, null);
|
||||
return findAnnotationInHierarchy(methodSignature, annotationNames, method, null,
|
||||
JavaPsiFacade.getInstance(method.getProject()).getResolveHelper());
|
||||
}
|
||||
if (listOwner instanceof PsiClass) {
|
||||
return findAnnotationInHierarchy((PsiClass)listOwner, annotationNames, null);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static PsiAnnotation findAnnotationInHierarchy(final @NotNull PsiClass psiClass, final Set<String> annotationNames, @Nullable Set<PsiClass> processed) {
|
||||
private static PsiAnnotation findAnnotationInHierarchy(@NotNull final PsiClass psiClass, final Set<String> annotationNames, @Nullable Set<PsiClass> processed) {
|
||||
final PsiClass[] superClasses = psiClass.getSupers();
|
||||
for (final PsiClass superClass : superClasses) {
|
||||
if (processed == null) processed = new THashSet<PsiClass>();
|
||||
@@ -168,12 +170,12 @@ public class AnnotationUtil {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static PsiAnnotation findAnnotationInHierarchy(HierarchicalMethodSignature signature,
|
||||
Set<String> annotationNames,
|
||||
PsiElement place,
|
||||
@Nullable Set<PsiMethod> processed) {
|
||||
private static PsiAnnotation findAnnotationInHierarchy(@NotNull HierarchicalMethodSignature signature,
|
||||
@NotNull Set<String> annotationNames,
|
||||
@NotNull PsiElement place,
|
||||
@Nullable Set<PsiMethod> processed,
|
||||
@NotNull PsiResolveHelper resolveHelper) {
|
||||
final List<HierarchicalMethodSignature> superSignatures = signature.getSuperSignatures();
|
||||
final PsiResolveHelper resolveHelper = JavaPsiFacade.getInstance(place.getProject()).getResolveHelper();
|
||||
for (final HierarchicalMethodSignature superSignature : superSignatures) {
|
||||
final PsiMethod superMethod = superSignature.getMethod();
|
||||
if (processed == null) processed = new THashSet<PsiMethod>();
|
||||
@@ -181,7 +183,7 @@ public class AnnotationUtil {
|
||||
if (!resolveHelper.isAccessible(superMethod, place, null)) continue;
|
||||
PsiAnnotation direct = findAnnotation(superMethod, annotationNames);
|
||||
if (direct != null) return direct;
|
||||
PsiAnnotation superResult = findAnnotationInHierarchy(superSignature, annotationNames, place, processed);
|
||||
PsiAnnotation superResult = findAnnotationInHierarchy(superSignature, annotationNames, place, processed, resolveHelper);
|
||||
if (superResult != null) return superResult;
|
||||
}
|
||||
|
||||
@@ -261,10 +263,10 @@ public class AnnotationUtil {
|
||||
* @return <code>true</code> if annotated of at least one annotation from the annotations list
|
||||
*/
|
||||
public static boolean checkAnnotatedUsingPatterns(PsiModifierListOwner owner, Collection<String> annotations) {
|
||||
List<String> fqns = null;
|
||||
final PsiModifierList modList;
|
||||
if (owner == null || (modList = owner.getModifierList()) == null) return false;
|
||||
|
||||
List<String> fqns = null;
|
||||
for (String fqn : annotations) {
|
||||
boolean isPattern = fqn.endsWith("*");
|
||||
if (!isPattern && isAnnotated(owner, fqn, false)) {
|
||||
@@ -307,4 +309,71 @@ public class AnnotationUtil {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static PsiAnnotation[] getAllAnnotations(@NotNull PsiModifierListOwner owner, boolean inHierarchy, Set<PsiModifierListOwner> visited) {
|
||||
final PsiModifierList list = owner.getModifierList();
|
||||
PsiAnnotation[] annotations = PsiAnnotation.EMPTY_ARRAY;
|
||||
if (list != null) {
|
||||
annotations = list.getAnnotations();
|
||||
}
|
||||
|
||||
final PsiAnnotation[] externalAnnotations = ExternalAnnotationsManager.getInstance(owner.getProject()).findExternalAnnotations(owner);
|
||||
if (externalAnnotations != null) {
|
||||
annotations = ArrayUtil.mergeArrays(annotations, externalAnnotations, PsiAnnotation.ARRAY_FACTORY);
|
||||
}
|
||||
|
||||
if (inHierarchy) {
|
||||
if (owner instanceof PsiClass) {
|
||||
for (PsiClass superClass : ((PsiClass)owner).getSupers()) {
|
||||
if (visited == null) visited = new THashSet<PsiModifierListOwner>();
|
||||
if (visited.add(superClass)) annotations = ArrayUtil.mergeArrays(annotations, getAllAnnotations(superClass, inHierarchy, visited));
|
||||
}
|
||||
}
|
||||
else if (owner instanceof PsiMethod) {
|
||||
PsiMethod method = (PsiMethod)owner;
|
||||
PsiClass aClass = method.getContainingClass();
|
||||
if (aClass != null) {
|
||||
HierarchicalMethodSignature methodSignature = method.getHierarchicalMethodSignature();
|
||||
|
||||
final List<HierarchicalMethodSignature> superSignatures = methodSignature.getSuperSignatures();
|
||||
PsiResolveHelper resolveHelper = PsiResolveHelper.SERVICE.getInstance(aClass.getProject());
|
||||
for (final HierarchicalMethodSignature superSignature : superSignatures) {
|
||||
final PsiMethod superMethod = superSignature.getMethod();
|
||||
if (visited == null) visited = new THashSet<PsiModifierListOwner>();
|
||||
if (!visited.add(superMethod)) continue;
|
||||
if (!resolveHelper.isAccessible(superMethod, owner, null)) continue;
|
||||
annotations = ArrayUtil.mergeArrays(annotations, getAllAnnotations(superMethod, inHierarchy, visited));
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (owner instanceof PsiParameter) {
|
||||
PsiParameter parameter = (PsiParameter)owner;
|
||||
PsiElement scope = parameter.getDeclarationScope();
|
||||
if (scope instanceof PsiMethod) {
|
||||
PsiMethod method = (PsiMethod)scope;
|
||||
PsiClass aClass = method.getContainingClass();
|
||||
PsiElement parent = parameter.getParent();
|
||||
if (aClass != null && parent instanceof PsiParameterList) {
|
||||
int index = ((PsiParameterList)parent).getParameterIndex(parameter);
|
||||
HierarchicalMethodSignature methodSignature = method.getHierarchicalMethodSignature();
|
||||
|
||||
final List<HierarchicalMethodSignature> superSignatures = methodSignature.getSuperSignatures();
|
||||
PsiResolveHelper resolveHelper = PsiResolveHelper.SERVICE.getInstance(aClass.getProject());
|
||||
for (final HierarchicalMethodSignature superSignature : superSignatures) {
|
||||
final PsiMethod superMethod = superSignature.getMethod();
|
||||
if (visited == null) visited = new THashSet<PsiModifierListOwner>();
|
||||
if (!visited.add(superMethod)) continue;
|
||||
if (!resolveHelper.isAccessible(superMethod, owner, null)) continue;
|
||||
PsiParameter[] superParameters = superMethod.getParameterList().getParameters();
|
||||
if (index < superParameters.length) {
|
||||
annotations = ArrayUtil.mergeArrays(annotations, getAllAnnotations(superParameters[index], inHierarchy, visited));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return annotations;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,18 +17,24 @@ package com.intellij.psi.util;
|
||||
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.psi.*;
|
||||
import org.intellij.lang.annotations.MagicConstant;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public class PsiFormatUtil extends PsiFormatUtilBase {
|
||||
@MagicConstant(flags = {SHOW_MODIFIERS, SHOW_TYPE, TYPE_AFTER, SHOW_CONTAINING_CLASS, SHOW_FQ_NAME, SHOW_NAME, SHOW_MODIFIERS, SHOW_INITIALIZER, SHOW_RAW_TYPE, SHOW_RAW_NON_TOP_TYPE, SHOW_FQ_CLASS_NAMES})
|
||||
public @interface FormatVariableOptions {}
|
||||
|
||||
public static String formatVariable(PsiVariable variable, int options, PsiSubstitutor substitutor){
|
||||
public static String formatVariable(PsiVariable variable, @FormatVariableOptions int options, PsiSubstitutor substitutor){
|
||||
StringBuilder buffer = new StringBuilder();
|
||||
formatVariable(variable, options, substitutor,buffer);
|
||||
return buffer.toString();
|
||||
}
|
||||
private static void formatVariable(PsiVariable variable, int options, PsiSubstitutor substitutor,StringBuilder buffer){
|
||||
private static void formatVariable(PsiVariable variable,
|
||||
@FormatVariableOptions int options,
|
||||
PsiSubstitutor substitutor,
|
||||
@NotNull StringBuilder buffer){
|
||||
if ((options & SHOW_MODIFIERS) != 0 && (options & MODIFIERS_AFTER) == 0){
|
||||
formatModifiers(variable, options,buffer);
|
||||
}
|
||||
@@ -97,16 +103,20 @@ public class PsiFormatUtil extends PsiFormatUtilBase {
|
||||
}
|
||||
}
|
||||
|
||||
public static String formatMethod(PsiMethod method, PsiSubstitutor substitutor, int options, int parameterOptions){
|
||||
public static String formatMethod(PsiMethod method, PsiSubstitutor substitutor, @FormatMethodOptions int options, @FormatVariableOptions int parameterOptions){
|
||||
return formatMethod(method, substitutor, options, parameterOptions, MAX_PARAMS_TO_SHOW);
|
||||
}
|
||||
|
||||
public static String formatMethod(PsiMethod method, PsiSubstitutor substitutor, int options, int parameterOptions, int maxParametersToShow){
|
||||
public static String formatMethod(PsiMethod method, PsiSubstitutor substitutor, @FormatMethodOptions int options, @FormatVariableOptions int parameterOptions, int maxParametersToShow){
|
||||
StringBuilder buffer = new StringBuilder();
|
||||
formatMethod(method, substitutor, options, parameterOptions, maxParametersToShow,buffer);
|
||||
return buffer.toString();
|
||||
}
|
||||
private static void formatMethod(PsiMethod method, PsiSubstitutor substitutor, int options, int parameterOptions, int maxParametersToShow, StringBuilder buffer){
|
||||
|
||||
@MagicConstant(flags = {SHOW_MODIFIERS, MODIFIERS_AFTER, SHOW_TYPE, TYPE_AFTER, SHOW_CONTAINING_CLASS, SHOW_FQ_NAME, SHOW_NAME, SHOW_PARAMETERS, SHOW_THROWS, SHOW_RAW_TYPE, SHOW_RAW_NON_TOP_TYPE, SHOW_FQ_CLASS_NAMES})
|
||||
public @interface FormatMethodOptions {}
|
||||
|
||||
private static void formatMethod(PsiMethod method, PsiSubstitutor substitutor, @FormatMethodOptions int options, @FormatVariableOptions int parameterOptions, int maxParametersToShow, StringBuilder buffer){
|
||||
if ((options & SHOW_MODIFIERS) != 0 && (options & MODIFIERS_AFTER) == 0){
|
||||
formatModifiers(method, options,buffer);
|
||||
}
|
||||
@@ -177,7 +187,7 @@ public class PsiFormatUtil extends PsiFormatUtilBase {
|
||||
}
|
||||
if ((options & SHOW_THROWS) != 0){
|
||||
String throwsText = formatReferenceList(method.getThrowsList(), options);
|
||||
if (throwsText.length() > 0){
|
||||
if (!throwsText.isEmpty()){
|
||||
appendSpaceIfNeeded(buffer);
|
||||
//noinspection HardCodedStringLiteral
|
||||
buffer.append("throws ");
|
||||
@@ -186,7 +196,12 @@ public class PsiFormatUtil extends PsiFormatUtilBase {
|
||||
}
|
||||
}
|
||||
|
||||
@NotNull public static String formatClass(@NotNull PsiClass aClass, int options){
|
||||
|
||||
@MagicConstant(flags = {SHOW_MODIFIERS, SHOW_NAME, SHOW_ANONYMOUS_CLASS_VERBOSE, SHOW_FQ_NAME, MODIFIERS_AFTER, SHOW_EXTENDS_IMPLEMENTS, SHOW_REDUNDANT_MODIFIERS, JAVADOC_MODIFIERS_ONLY})
|
||||
public @interface FormatClassOptions {}
|
||||
|
||||
@NotNull
|
||||
public static String formatClass(@NotNull PsiClass aClass, @FormatClassOptions int options){
|
||||
StringBuilder buffer = new StringBuilder();
|
||||
if ((options & SHOW_MODIFIERS) != 0 && (options & MODIFIERS_AFTER) == 0){
|
||||
formatModifiers(aClass, options,buffer);
|
||||
@@ -222,14 +237,14 @@ public class PsiFormatUtil extends PsiFormatUtilBase {
|
||||
}
|
||||
if ((options & SHOW_EXTENDS_IMPLEMENTS) != 0){
|
||||
String extendsText = formatReferenceList(aClass.getExtendsList(), options);
|
||||
if (extendsText.length() > 0){
|
||||
if (!extendsText.isEmpty()){
|
||||
appendSpaceIfNeeded(buffer);
|
||||
//noinspection HardCodedStringLiteral
|
||||
buffer.append("extends ");
|
||||
buffer.append(extendsText);
|
||||
}
|
||||
String implementsText = formatReferenceList(aClass.getImplementsList(), options);
|
||||
if (implementsText.length() > 0){
|
||||
if (!implementsText.isEmpty()){
|
||||
appendSpaceIfNeeded(buffer);
|
||||
//noinspection HardCodedStringLiteral
|
||||
buffer.append("implements ");
|
||||
@@ -340,7 +355,7 @@ public class PsiFormatUtil extends PsiFormatUtilBase {
|
||||
return buffer.toString();
|
||||
}
|
||||
|
||||
public static String formatType(PsiType type, int options, PsiSubstitutor substitutor){
|
||||
public static String formatType(PsiType type, int options, @NotNull PsiSubstitutor substitutor){
|
||||
type = substitutor.substitute(type);
|
||||
if ((options & SHOW_RAW_TYPE) != 0) {
|
||||
type = TypeConversionUtil.erasure(type);
|
||||
@@ -367,6 +382,11 @@ public class PsiFormatUtil extends PsiFormatUtilBase {
|
||||
|
||||
@Nullable
|
||||
public static String getExternalName(PsiModifierListOwner owner, final boolean showParamName) {
|
||||
return getExternalName(owner, showParamName, MAX_PARAMS_TO_SHOW);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static String getExternalName(PsiModifierListOwner owner, final boolean showParamName, int maxParamsToShow) {
|
||||
final StringBuilder builder = new StringBuilder();
|
||||
if (owner instanceof PsiClass) {
|
||||
ClassUtil.formatClassName((PsiClass)owner, builder);
|
||||
@@ -379,7 +399,7 @@ public class PsiFormatUtil extends PsiFormatUtilBase {
|
||||
builder.append(" ");
|
||||
formatMethod((PsiMethod)owner, PsiSubstitutor.EMPTY,
|
||||
SHOW_NAME | SHOW_FQ_NAME | SHOW_TYPE | SHOW_PARAMETERS | SHOW_FQ_CLASS_NAMES,
|
||||
showParamName ? SHOW_NAME | SHOW_TYPE | SHOW_FQ_CLASS_NAMES : SHOW_TYPE | SHOW_FQ_CLASS_NAMES, MAX_PARAMS_TO_SHOW, builder);
|
||||
showParamName ? SHOW_NAME | SHOW_TYPE | SHOW_FQ_CLASS_NAMES : SHOW_TYPE | SHOW_FQ_CLASS_NAMES, maxParamsToShow, builder);
|
||||
}
|
||||
else if (owner instanceof PsiField) {
|
||||
builder.append(" ").append(((PsiField)owner).getName());
|
||||
@@ -392,7 +412,7 @@ public class PsiFormatUtil extends PsiFormatUtilBase {
|
||||
builder.append(" ");
|
||||
formatMethod(psiMethod, PsiSubstitutor.EMPTY,
|
||||
SHOW_NAME | SHOW_FQ_NAME | SHOW_TYPE | SHOW_PARAMETERS | SHOW_FQ_CLASS_NAMES,
|
||||
showParamName ? SHOW_NAME | SHOW_TYPE | SHOW_FQ_CLASS_NAMES : SHOW_TYPE | SHOW_FQ_CLASS_NAMES, MAX_PARAMS_TO_SHOW, builder);
|
||||
showParamName ? SHOW_NAME | SHOW_TYPE | SHOW_FQ_CLASS_NAMES : SHOW_TYPE | SHOW_FQ_CLASS_NAMES, maxParamsToShow, builder);
|
||||
builder.append(" ");
|
||||
|
||||
if (showParamName) {
|
||||
@@ -415,7 +435,7 @@ public class PsiFormatUtil extends PsiFormatUtilBase {
|
||||
public static String getPackageDisplayName(@NotNull final PsiClass psiClass) {
|
||||
@NonNls String packageName = psiClass.getQualifiedName();
|
||||
packageName = packageName == null || packageName.lastIndexOf('.') <= 0 ? "" : packageName.substring(0, packageName.lastIndexOf('.'));
|
||||
if (packageName.length() == 0) {
|
||||
if (packageName.isEmpty()) {
|
||||
packageName = "default package";
|
||||
}
|
||||
return packageName;
|
||||
|
||||
Reference in New Issue
Block a user