Update UAST to version 1.0.11
This commit is contained in:
@@ -16,10 +16,6 @@
|
||||
|
||||
package com.android.tools.klint.detector.api;
|
||||
|
||||
import static com.android.SdkConstants.CLASS_CONTEXT;
|
||||
import static com.android.tools.klint.client.api.JavaParser.ResolvedNode;
|
||||
import static com.android.tools.klint.client.api.JavaParser.TypeDescriptor;
|
||||
|
||||
import com.android.annotations.NonNull;
|
||||
import com.android.annotations.Nullable;
|
||||
import com.android.tools.klint.client.api.JavaEvaluator;
|
||||
@@ -31,46 +27,19 @@ import com.google.common.collect.Iterators;
|
||||
import com.intellij.openapi.util.TextRange;
|
||||
import com.intellij.openapi.vfs.VfsUtilCore;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.PsiAnnotation;
|
||||
import com.intellij.psi.PsiAnonymousClass;
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiEnumConstant;
|
||||
import com.intellij.psi.PsiExpression;
|
||||
import com.intellij.psi.PsiField;
|
||||
import com.intellij.psi.PsiJavaCodeReferenceElement;
|
||||
import com.intellij.psi.PsiJavaFile;
|
||||
import com.intellij.psi.PsiLabeledStatement;
|
||||
import com.intellij.psi.PsiMember;
|
||||
import com.intellij.psi.PsiMethod;
|
||||
import com.intellij.psi.PsiMethodCallExpression;
|
||||
import com.intellij.psi.PsiNameIdentifierOwner;
|
||||
import com.intellij.psi.PsiNewExpression;
|
||||
import com.intellij.psi.PsiReferenceExpression;
|
||||
import com.intellij.psi.PsiSwitchStatement;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
|
||||
import lombok.ast.*;
|
||||
import lombok.ast.Position;
|
||||
import org.jetbrains.uast.*;
|
||||
import org.jetbrains.uast.psi.PsiElementBacked;
|
||||
import org.jetbrains.uast.psi.UElementWithLocation;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Iterator;
|
||||
|
||||
import lombok.ast.AnnotationElement;
|
||||
import lombok.ast.AnnotationMethodDeclaration;
|
||||
import lombok.ast.ClassDeclaration;
|
||||
import lombok.ast.ConstructorDeclaration;
|
||||
import lombok.ast.ConstructorInvocation;
|
||||
import lombok.ast.EnumConstant;
|
||||
import lombok.ast.Expression;
|
||||
import lombok.ast.LabelledStatement;
|
||||
import lombok.ast.MethodDeclaration;
|
||||
import lombok.ast.MethodInvocation;
|
||||
import lombok.ast.Node;
|
||||
import lombok.ast.Position;
|
||||
import lombok.ast.TypeDeclaration;
|
||||
import lombok.ast.VariableReference;
|
||||
import static com.android.SdkConstants.CLASS_CONTEXT;
|
||||
import static com.android.tools.klint.client.api.JavaParser.ResolvedNode;
|
||||
import static com.android.tools.klint.client.api.JavaParser.TypeDescriptor;
|
||||
|
||||
/**
|
||||
* A {@link Context} used when checking Java files.
|
||||
@@ -252,8 +221,8 @@ public class JavaContext extends Context {
|
||||
UElementWithLocation segment = (UElementWithLocation) node;
|
||||
return Location.create(ioFile, file.getPsi().getText(),
|
||||
segment.getStartOffset(), segment.getEndOffset());
|
||||
} else if (node instanceof PsiElementBacked) {
|
||||
PsiElement psiElement = ((PsiElementBacked) node).getPsi();
|
||||
} else {
|
||||
PsiElement psiElement = node.getPsi();
|
||||
if (psiElement != null) {
|
||||
TextRange range = psiElement.getTextRange();
|
||||
UFile containingFile = getUFile();
|
||||
@@ -478,10 +447,7 @@ public class JavaContext extends Context {
|
||||
}
|
||||
|
||||
public boolean isSuppressedWithComment(@NonNull UElement scope, @NonNull Issue issue) {
|
||||
if (!(scope instanceof PsiElementBacked)) {
|
||||
return false;
|
||||
}
|
||||
PsiElement psi = ((PsiElementBacked) scope).getPsi();
|
||||
PsiElement psi = scope.getPsi();
|
||||
return psi != null && isSuppressedWithComment(psi, issue);
|
||||
|
||||
}
|
||||
|
||||
+6
-12
@@ -416,14 +416,12 @@ public class AnnotationDetector extends Detector implements Detector.UastScanner
|
||||
if (condition != null && PsiType.INT.equals(condition.getExpressionType())) {
|
||||
UAnnotation annotation = findIntDefAnnotation(condition);
|
||||
if (annotation != null) {
|
||||
UNamedExpression namedValue =
|
||||
UExpression value =
|
||||
annotation.findDeclaredAttributeValue(ATTR_VALUE);
|
||||
if (namedValue == null) {
|
||||
namedValue = annotation.findDeclaredAttributeValue(null);
|
||||
if (value == null) {
|
||||
value = annotation.findDeclaredAttributeValue(null);
|
||||
}
|
||||
|
||||
UExpression value = (namedValue != null) ? namedValue.getExpression() : null;
|
||||
|
||||
if (UastExpressionUtils.isArrayInitializer(value)) {
|
||||
List<UExpression> allowedValues =
|
||||
((UCallExpression) value).getValueArguments();
|
||||
@@ -514,14 +512,10 @@ public class AnnotationDetector extends Detector implements Detector.UastScanner
|
||||
}
|
||||
|
||||
private void ensureUniqueValues(@NonNull UAnnotation node) {
|
||||
UNamedExpression namedValue = node.findAttributeValue(ATTR_VALUE);
|
||||
if (namedValue == null) {
|
||||
namedValue = node.findAttributeValue(null);
|
||||
UExpression value = node.findAttributeValue(ATTR_VALUE);
|
||||
if (value == null) {
|
||||
value = node.findAttributeValue(null);
|
||||
}
|
||||
if (namedValue == null) {
|
||||
return;
|
||||
}
|
||||
UExpression value = namedValue.getExpression();
|
||||
|
||||
if (!(UastExpressionUtils.isArrayInitializer(value))) {
|
||||
return;
|
||||
|
||||
@@ -1263,34 +1263,28 @@ public class ApiDetector extends ResourceXmlDetector
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visitVariable(@NotNull UVariable node) {
|
||||
if (node instanceof ULocalVariable) {
|
||||
visitLocalVariable((ULocalVariable) node);
|
||||
}
|
||||
return super.visitVariable(node);
|
||||
}
|
||||
|
||||
private void visitLocalVariable(ULocalVariable variable) {
|
||||
public boolean visitLocalVariable(ULocalVariable variable) {
|
||||
UExpression initializer = variable.getUastInitializer();
|
||||
if (initializer == null) {
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
|
||||
PsiType initializerType = initializer.getExpressionType();
|
||||
if (!(initializerType instanceof PsiClassType)) {
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
|
||||
PsiType interfaceType = variable.getType();
|
||||
if (initializerType.equals(interfaceType)) {
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!(interfaceType instanceof PsiClassType)) {
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
|
||||
checkCast(initializer, (PsiClassType)initializerType, (PsiClassType)interfaceType);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+14
-18
@@ -16,25 +16,18 @@
|
||||
package com.android.tools.klint.checks;
|
||||
|
||||
|
||||
import static com.android.SdkConstants.ATTR_VALUE;
|
||||
import static com.android.tools.klint.checks.SupportAnnotationDetector.ATTR_ALL_OF;
|
||||
import static com.android.tools.klint.checks.SupportAnnotationDetector.ATTR_ANY_OF;
|
||||
import static com.android.tools.klint.checks.SupportAnnotationDetector.ATTR_CONDITIONAL;
|
||||
|
||||
import com.android.annotations.NonNull;
|
||||
import com.android.annotations.Nullable;
|
||||
import com.android.annotations.VisibleForTesting;
|
||||
import com.android.sdklib.AndroidVersion;
|
||||
import com.android.tools.klint.detector.api.ConstantEvaluator;
|
||||
import com.android.tools.klint.detector.api.JavaContext;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Sets;
|
||||
import com.intellij.psi.JavaTokenType;
|
||||
import com.intellij.psi.PsiAnnotation;
|
||||
import com.intellij.psi.PsiAnnotationMemberValue;
|
||||
import com.intellij.psi.PsiArrayInitializerMemberValue;
|
||||
import com.intellij.psi.tree.IElementType;
|
||||
import org.jetbrains.uast.*;
|
||||
import org.jetbrains.uast.UAnnotation;
|
||||
import org.jetbrains.uast.UCallExpression;
|
||||
import org.jetbrains.uast.UExpression;
|
||||
import org.jetbrains.uast.util.UastExpressionUtils;
|
||||
|
||||
import java.util.Arrays;
|
||||
@@ -42,6 +35,9 @@ import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import static com.android.SdkConstants.ATTR_VALUE;
|
||||
import static com.android.tools.klint.checks.SupportAnnotationDetector.*;
|
||||
|
||||
/**
|
||||
* A permission requirement is a boolean expression of permission names that a
|
||||
* caller must satisfy for a given Android API.
|
||||
@@ -140,7 +136,7 @@ public abstract class PermissionRequirement {
|
||||
public static Boolean getAnnotationBooleanValue(@Nullable UAnnotation annotation,
|
||||
@NonNull String name) {
|
||||
if (annotation != null) {
|
||||
UNamedExpression attributeValue = annotation.findDeclaredAttributeValue(name);
|
||||
UExpression attributeValue = annotation.findDeclaredAttributeValue(name);
|
||||
if (attributeValue == null && ATTR_VALUE.equals(name)) {
|
||||
attributeValue = annotation.findDeclaredAttributeValue(null);
|
||||
}
|
||||
@@ -160,7 +156,7 @@ public abstract class PermissionRequirement {
|
||||
public static Long getAnnotationLongValue(@Nullable UAnnotation annotation,
|
||||
@NonNull String name) {
|
||||
if (annotation != null) {
|
||||
UNamedExpression attributeValue = annotation.findDeclaredAttributeValue(name);
|
||||
UExpression attributeValue = annotation.findDeclaredAttributeValue(name);
|
||||
if (attributeValue == null && ATTR_VALUE.equals(name)) {
|
||||
attributeValue = annotation.findDeclaredAttributeValue(null);
|
||||
}
|
||||
@@ -180,7 +176,7 @@ public abstract class PermissionRequirement {
|
||||
public static Double getAnnotationDoubleValue(@Nullable UAnnotation annotation,
|
||||
@NonNull String name) {
|
||||
if (annotation != null) {
|
||||
UNamedExpression attributeValue = annotation.findDeclaredAttributeValue(name);
|
||||
UExpression attributeValue = annotation.findDeclaredAttributeValue(name);
|
||||
if (attributeValue == null && ATTR_VALUE.equals(name)) {
|
||||
attributeValue = annotation.findDeclaredAttributeValue(null);
|
||||
}
|
||||
@@ -200,7 +196,7 @@ public abstract class PermissionRequirement {
|
||||
public static String getAnnotationStringValue(@Nullable UAnnotation annotation,
|
||||
@NonNull String name) {
|
||||
if (annotation != null) {
|
||||
UNamedExpression attributeValue = annotation.findDeclaredAttributeValue(name);
|
||||
UExpression attributeValue = annotation.findDeclaredAttributeValue(name);
|
||||
if (attributeValue == null && ATTR_VALUE.equals(name)) {
|
||||
attributeValue = annotation.findDeclaredAttributeValue(null);
|
||||
}
|
||||
@@ -220,16 +216,16 @@ public abstract class PermissionRequirement {
|
||||
public static String[] getAnnotationStringValues(@Nullable UAnnotation annotation,
|
||||
@NonNull String name) {
|
||||
if (annotation != null) {
|
||||
UNamedExpression attributeValue = annotation.findDeclaredAttributeValue(name);
|
||||
UExpression attributeValue = annotation.findDeclaredAttributeValue(name);
|
||||
if (attributeValue == null && ATTR_VALUE.equals(name)) {
|
||||
attributeValue = annotation.findDeclaredAttributeValue(null);
|
||||
}
|
||||
if (attributeValue == null) {
|
||||
return null;
|
||||
}
|
||||
if (UastExpressionUtils.isArrayInitializer(attributeValue.getExpression())) {
|
||||
if (UastExpressionUtils.isArrayInitializer(attributeValue)) {
|
||||
List<UExpression> initializers =
|
||||
((UCallExpression) attributeValue.getExpression()).getValueArguments();
|
||||
((UCallExpression) attributeValue).getValueArguments();
|
||||
List<String> result = Lists.newArrayListWithCapacity(initializers.size());
|
||||
ConstantEvaluator constantEvaluator = new ConstantEvaluator(null);
|
||||
for (UExpression element : initializers) {
|
||||
@@ -245,7 +241,7 @@ public abstract class PermissionRequirement {
|
||||
}
|
||||
} else {
|
||||
// Use constant evaluator since we want to resolve field references as well
|
||||
Object o = ConstantEvaluator.evaluate(null, attributeValue.getExpression());
|
||||
Object o = ConstantEvaluator.evaluate(null, attributeValue);
|
||||
if (o instanceof String) {
|
||||
return new String[]{(String) o};
|
||||
} else if (o instanceof String[]) {
|
||||
|
||||
+12
-70
@@ -16,37 +16,6 @@
|
||||
|
||||
package com.android.tools.klint.checks;
|
||||
|
||||
import static com.android.SdkConstants.ANDROID_URI;
|
||||
import static com.android.SdkConstants.ATTR_NAME;
|
||||
import static com.android.SdkConstants.ATTR_VALUE;
|
||||
import static com.android.SdkConstants.CLASS_INTENT;
|
||||
import static com.android.SdkConstants.CLASS_VIEW;
|
||||
import static com.android.SdkConstants.INT_DEF_ANNOTATION;
|
||||
import static com.android.SdkConstants.STRING_DEF_ANNOTATION;
|
||||
import static com.android.SdkConstants.SUPPORT_ANNOTATIONS_PREFIX;
|
||||
import static com.android.SdkConstants.TAG_PERMISSION;
|
||||
import static com.android.SdkConstants.TAG_USES_PERMISSION;
|
||||
import static com.android.SdkConstants.TAG_USES_PERMISSION_SDK_23;
|
||||
import static com.android.SdkConstants.TAG_USES_PERMISSION_SDK_M;
|
||||
import static com.android.SdkConstants.TYPE_DEF_FLAG_ATTRIBUTE;
|
||||
import static com.android.resources.ResourceType.COLOR;
|
||||
import static com.android.resources.ResourceType.DIMEN;
|
||||
import static com.android.resources.ResourceType.DRAWABLE;
|
||||
import static com.android.resources.ResourceType.MIPMAP;
|
||||
import static com.android.tools.klint.checks.PermissionFinder.Operation.ACTION;
|
||||
import static com.android.tools.klint.checks.PermissionFinder.Operation.READ;
|
||||
import static com.android.tools.klint.checks.PermissionFinder.Operation.WRITE;
|
||||
import static com.android.tools.klint.checks.PermissionRequirement.ATTR_PROTECTION_LEVEL;
|
||||
import static com.android.tools.klint.checks.PermissionRequirement.VALUE_DANGEROUS;
|
||||
import static com.android.tools.klint.checks.PermissionRequirement.getAnnotationBooleanValue;
|
||||
import static com.android.tools.klint.checks.PermissionRequirement.getAnnotationDoubleValue;
|
||||
import static com.android.tools.klint.checks.PermissionRequirement.getAnnotationLongValue;
|
||||
import static com.android.tools.klint.checks.PermissionRequirement.getAnnotationStringValue;
|
||||
import static com.android.tools.klint.detector.api.ResourceEvaluator.COLOR_INT_ANNOTATION;
|
||||
import static com.android.tools.klint.detector.api.ResourceEvaluator.PX_ANNOTATION;
|
||||
import static com.android.tools.klint.detector.api.ResourceEvaluator.RES_SUFFIX;
|
||||
import static org.jetbrains.uast.UastUtils.getQualifiedParentOrThis;
|
||||
|
||||
import com.android.annotations.NonNull;
|
||||
import com.android.annotations.Nullable;
|
||||
import com.android.resources.ResourceType;
|
||||
@@ -58,35 +27,11 @@ import com.android.tools.klint.client.api.ExternalReferenceExpression;
|
||||
import com.android.tools.klint.client.api.JavaEvaluator;
|
||||
import com.android.tools.klint.client.api.LintClient;
|
||||
import com.android.tools.klint.client.api.UastLintUtils;
|
||||
import com.android.tools.klint.detector.api.Category;
|
||||
import com.android.tools.klint.detector.api.ConstantEvaluator;
|
||||
import com.android.tools.klint.detector.api.Detector;
|
||||
import com.android.tools.klint.detector.api.Implementation;
|
||||
import com.android.tools.klint.detector.api.Issue;
|
||||
import com.android.tools.klint.detector.api.JavaContext;
|
||||
import com.android.tools.klint.detector.api.Project;
|
||||
import com.android.tools.klint.detector.api.ResourceEvaluator;
|
||||
import com.android.tools.klint.detector.api.Scope;
|
||||
import com.android.tools.klint.detector.api.Severity;
|
||||
import com.android.tools.klint.detector.api.TextFormat;
|
||||
import com.android.tools.klint.detector.api.*;
|
||||
import com.android.utils.XmlUtils;
|
||||
import com.google.common.base.Joiner;
|
||||
import com.google.common.collect.Sets;
|
||||
import com.intellij.psi.PsiAnnotation;
|
||||
import com.intellij.psi.PsiArrayType;
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiClassType;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiField;
|
||||
import com.intellij.psi.PsiJavaCodeReferenceElement;
|
||||
import com.intellij.psi.PsiMethod;
|
||||
import com.intellij.psi.PsiModifier;
|
||||
import com.intellij.psi.PsiModifierList;
|
||||
import com.intellij.psi.PsiParameter;
|
||||
import com.intellij.psi.PsiParameterList;
|
||||
import com.intellij.psi.PsiType;
|
||||
import com.intellij.psi.PsiVariable;
|
||||
|
||||
import com.intellij.psi.*;
|
||||
import org.jetbrains.uast.*;
|
||||
import org.jetbrains.uast.java.JavaUAnnotation;
|
||||
import org.jetbrains.uast.util.UastExpressionUtils;
|
||||
@@ -98,13 +43,14 @@ import org.w3c.dom.Node;
|
||||
import org.w3c.dom.NodeList;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.EnumSet;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
|
||||
import static com.android.SdkConstants.*;
|
||||
import static com.android.resources.ResourceType.*;
|
||||
import static com.android.tools.klint.checks.PermissionFinder.Operation.*;
|
||||
import static com.android.tools.klint.checks.PermissionRequirement.*;
|
||||
import static com.android.tools.klint.detector.api.ResourceEvaluator.*;
|
||||
import static org.jetbrains.uast.UastUtils.getQualifiedParentOrThis;
|
||||
|
||||
/**
|
||||
* Looks up annotations on method calls and enforces the various things they
|
||||
@@ -1710,15 +1656,11 @@ public class SupportAnnotationDetector extends Detector implements Detector.Uast
|
||||
|
||||
@Nullable
|
||||
private static UExpression getAnnotationValue(@NonNull UAnnotation annotation) {
|
||||
UNamedExpression value = annotation.findDeclaredAttributeValue(ATTR_VALUE);
|
||||
UExpression value = annotation.findDeclaredAttributeValue(ATTR_VALUE);
|
||||
if (value == null) {
|
||||
value = annotation.findDeclaredAttributeValue(null);
|
||||
}
|
||||
if (value == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return value.getExpression();
|
||||
return value;
|
||||
}
|
||||
|
||||
private static String listAllowedValues(@NonNull UElement context,
|
||||
|
||||
+3
-6
@@ -40,7 +40,6 @@ import org.jetbrains.android.facet.AndroidFacet;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.uast.*;
|
||||
import org.jetbrains.uast.psi.PsiElementBacked;
|
||||
import org.jetbrains.uast.psi.UElementWithLocation;
|
||||
import org.jetbrains.uast.util.UastExpressionUtils;
|
||||
|
||||
@@ -116,11 +115,9 @@ public class IntellijLintUtils {
|
||||
}
|
||||
|
||||
TextRange textRange = null;
|
||||
if (element instanceof PsiElementBacked) {
|
||||
PsiElement psi = ((PsiElementBacked) element).getPsi();
|
||||
if (psi != null) {
|
||||
textRange = psi.getTextRange();
|
||||
}
|
||||
PsiElement psi = element.getPsi();
|
||||
if (psi != null) {
|
||||
textRange = psi.getTextRange();
|
||||
} else if (element instanceof UElementWithLocation) {
|
||||
UElementWithLocation elementWithLocation = (UElementWithLocation) element;
|
||||
textRange = new TextRange(
|
||||
|
||||
Reference in New Issue
Block a user