Merge "Properly pick array type for annotation literal arrays" into studio-1.3-dev automerge: 798e777
automerge: fd1a97e
* commit 'fd1a97e7bf6c0c30f30ca1c7e91b86f94f3a0887':
Properly pick array type for annotation literal arrays
diff --git a/android/src/org/jetbrains/android/inspections/lint/LombokPsiParser.java b/android/src/org/jetbrains/android/inspections/lint/LombokPsiParser.java
index 0c4b7ed..dc21bd2 100644
--- a/android/src/org/jetbrains/android/inspections/lint/LombokPsiParser.java
+++ b/android/src/org/jetbrains/android/inspections/lint/LombokPsiParser.java
@@ -33,13 +33,17 @@
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Computable;
import com.intellij.psi.*;
+import com.intellij.psi.impl.JavaConstantExpressionEvaluator;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.TypeConversionUtil;
+import com.intellij.util.ArrayUtil;
import lombok.ast.Node;
import lombok.ast.Position;
import org.jetbrains.annotations.Contract;
+import org.jetbrains.annotations.NotNull;
import java.io.File;
+import java.lang.annotation.Annotation;
import java.lang.reflect.Modifier;
import java.util.Collections;
import java.util.List;
@@ -955,6 +959,11 @@
}
}
+ @NotNull
+ public static ResolvedAnnotation createResolvedAnnotation(@NonNull PsiAnnotation annotation) {
+ return new ResolvedPsiAnnotation(annotation);
+ }
+
private static class ResolvedPsiAnnotation extends ResolvedAnnotation {
private PsiAnnotation myAnnotation;
@@ -1041,16 +1050,63 @@
} else if (v instanceof PsiArrayInitializerMemberValue) {
PsiArrayInitializerMemberValue mv = (PsiArrayInitializerMemberValue)v;
PsiAnnotationMemberValue[] values = mv.getInitializers();
- Object[] result = new Object[values.length];
- int index = 0;
+ List<Object> list = Lists.newArrayListWithExpectedSize(values.length);
for (PsiAnnotationMemberValue mmv : values) {
if (mmv instanceof PsiLiteral) {
- PsiLiteral literal = (PsiLiteral) mmv;
- result[index] = literal.getValue();
+ PsiLiteral literal = (PsiLiteral)mmv;
+ list.add(literal.getValue());
+ } else if (mmv instanceof PsiExpression) {
+ list.add(JavaConstantExpressionEvaluator.computeConstantExpression((PsiExpression)mmv, false));
}
- index++;
}
- return result;
+
+ PsiReference reference = pair.getReference();
+ if (reference != null) {
+ PsiElement resolved = reference.resolve();
+ if (resolved instanceof PsiAnnotationMethod) {
+ PsiType returnType = ((PsiAnnotationMethod)resolved).getReturnType();
+ if (returnType != null && returnType.getDeepComponentType().getCanonicalText().equals(CommonClassNames.JAVA_LANG_STRING)) {
+ //noinspection SSBasedInspection,SuspiciousToArrayCall
+ return list.toArray(new String[list.size()]);
+ } else if (returnType != null && returnType.getDeepComponentType().getCanonicalText().equals(
+ CommonClassNames.JAVA_LANG_ANNOTATION_ANNOTATION)) {
+ //noinspection SSBasedInspection,SuspiciousToArrayCall
+ return list.toArray(new Annotation[list.size()]);
+ } else if (returnType == PsiType.INT) {
+ //noinspection SSBasedInspection,SuspiciousToArrayCall
+ return list.toArray(new Integer[list.size()]);
+ } else if (returnType == PsiType.LONG) {
+ //noinspection SSBasedInspection,SuspiciousToArrayCall
+ return list.toArray(new Long[list.size()]);
+ } else if (returnType == PsiType.DOUBLE) {
+ //noinspection SSBasedInspection,SuspiciousToArrayCall
+ return list.toArray(new Double[list.size()]);
+ } else if (returnType == PsiType.FLOAT) {
+ //noinspection SSBasedInspection,SuspiciousToArrayCall
+ return list.toArray(new Float[list.size()]);
+ }
+ }
+ }
+
+ // Pick type of array. Annotations are limited to Strings, Classes
+ // and Annotations
+ if (!list.isEmpty()) {
+ Object first = list.get(0);
+ if (first instanceof String) {
+ //noinspection SuspiciousToArrayCall,SSBasedInspection
+ return list.toArray(new String[list.size()]);
+ } else if (first instanceof Annotation) {
+ //noinspection SuspiciousToArrayCall
+ return list.toArray(new Annotation[list.size()]);
+ } else if (first instanceof Class) {
+ //noinspection SuspiciousToArrayCall
+ return list.toArray(new Class[list.size()]);
+ }
+ } else {
+ return ArrayUtil.EMPTY_STRING_ARRAY;
+ }
+
+ return list.toArray();
}
return null;