Update UAST to version 1.0.11

This commit is contained in:
Dmitry Jemerov
2017-02-09 19:19:40 +01:00
parent da2f310895
commit 87187437ab
56 changed files with 170 additions and 273 deletions
@@ -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);
}
@@ -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
@@ -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[]) {
@@ -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,
@@ -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(