Update to UAST 0.12
This commit is contained in:
@@ -2622,7 +2622,7 @@ public class LintDriver {
|
||||
return true;
|
||||
}
|
||||
|
||||
scope = scope.getContainingElement();
|
||||
scope = scope.getUastParent();
|
||||
if (scope instanceof PsiFile) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -477,7 +477,7 @@ public class UElementVisitor {
|
||||
}
|
||||
}
|
||||
|
||||
cls = cls.getUastSuperClass();
|
||||
cls = cls.getSuperClass();
|
||||
depth++;
|
||||
if (depth == 500) {
|
||||
// Shouldn't happen in practice; this prevents the IDE from
|
||||
|
||||
@@ -16,41 +16,6 @@
|
||||
|
||||
package com.android.tools.klint.detector.api;
|
||||
|
||||
import static com.android.SdkConstants.ANDROID_MANIFEST_XML;
|
||||
import static com.android.SdkConstants.ANDROID_PREFIX;
|
||||
import static com.android.SdkConstants.ANDROID_URI;
|
||||
import static com.android.SdkConstants.ATTR_LOCALE;
|
||||
import static com.android.SdkConstants.BIN_FOLDER;
|
||||
import static com.android.SdkConstants.DOT_GIF;
|
||||
import static com.android.SdkConstants.DOT_JPEG;
|
||||
import static com.android.SdkConstants.DOT_JPG;
|
||||
import static com.android.SdkConstants.DOT_PNG;
|
||||
import static com.android.SdkConstants.DOT_WEBP;
|
||||
import static com.android.SdkConstants.DOT_XML;
|
||||
import static com.android.SdkConstants.FN_BUILD_GRADLE;
|
||||
import static com.android.SdkConstants.ID_PREFIX;
|
||||
import static com.android.SdkConstants.NEW_ID_PREFIX;
|
||||
import static com.android.SdkConstants.TOOLS_URI;
|
||||
import static com.android.SdkConstants.UTF_8;
|
||||
import static com.android.ide.common.resources.configuration.FolderConfiguration.QUALIFIER_SPLITTER;
|
||||
import static com.android.ide.common.resources.configuration.LocaleQualifier.BCP_47_PREFIX;
|
||||
import static com.android.tools.klint.client.api.JavaParser.TYPE_BOOLEAN;
|
||||
import static com.android.tools.klint.client.api.JavaParser.TYPE_BOOLEAN_WRAPPER;
|
||||
import static com.android.tools.klint.client.api.JavaParser.TYPE_BYTE;
|
||||
import static com.android.tools.klint.client.api.JavaParser.TYPE_BYTE_WRAPPER;
|
||||
import static com.android.tools.klint.client.api.JavaParser.TYPE_CHAR;
|
||||
import static com.android.tools.klint.client.api.JavaParser.TYPE_CHARACTER_WRAPPER;
|
||||
import static com.android.tools.klint.client.api.JavaParser.TYPE_DOUBLE;
|
||||
import static com.android.tools.klint.client.api.JavaParser.TYPE_DOUBLE_WRAPPER;
|
||||
import static com.android.tools.klint.client.api.JavaParser.TYPE_FLOAT;
|
||||
import static com.android.tools.klint.client.api.JavaParser.TYPE_FLOAT_WRAPPER;
|
||||
import static com.android.tools.klint.client.api.JavaParser.TYPE_INT;
|
||||
import static com.android.tools.klint.client.api.JavaParser.TYPE_INTEGER_WRAPPER;
|
||||
import static com.android.tools.klint.client.api.JavaParser.TYPE_LONG;
|
||||
import static com.android.tools.klint.client.api.JavaParser.TYPE_LONG_WRAPPER;
|
||||
import static com.android.tools.klint.client.api.JavaParser.TYPE_SHORT;
|
||||
import static com.android.tools.klint.client.api.JavaParser.TYPE_SHORT_WRAPPER;
|
||||
|
||||
import com.android.annotations.NonNull;
|
||||
import com.android.annotations.Nullable;
|
||||
import com.android.builder.model.AndroidProject;
|
||||
@@ -78,21 +43,14 @@ import com.google.common.base.Splitter;
|
||||
import com.google.common.collect.Iterables;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Sets;
|
||||
import com.intellij.psi.CommonClassNames;
|
||||
import com.intellij.psi.PsiClassType;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiImportStatement;
|
||||
import com.intellij.psi.PsiLiteral;
|
||||
import com.intellij.psi.PsiParenthesizedExpression;
|
||||
import com.intellij.psi.PsiType;
|
||||
import com.intellij.psi.PsiWhiteSpace;
|
||||
|
||||
import org.jetbrains.uast.UElement;
|
||||
import org.jetbrains.uast.UParenthesizedExpression;
|
||||
import com.intellij.psi.*;
|
||||
import lombok.ast.ImportDeclaration;
|
||||
import org.jetbrains.org.objectweb.asm.Opcodes;
|
||||
import org.jetbrains.org.objectweb.asm.tree.AbstractInsnNode;
|
||||
import org.jetbrains.org.objectweb.asm.tree.ClassNode;
|
||||
import org.jetbrains.org.objectweb.asm.tree.FieldNode;
|
||||
import org.jetbrains.uast.UElement;
|
||||
import org.jetbrains.uast.UParenthesizedExpression;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.Node;
|
||||
import org.w3c.dom.NodeList;
|
||||
@@ -100,17 +58,15 @@ import org.w3c.dom.NodeList;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.util.ArrayDeque;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Queue;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.regex.PatternSyntaxException;
|
||||
|
||||
import lombok.ast.ImportDeclaration;
|
||||
import static com.android.SdkConstants.*;
|
||||
import static com.android.ide.common.resources.configuration.FolderConfiguration.QUALIFIER_SPLITTER;
|
||||
import static com.android.ide.common.resources.configuration.LocaleQualifier.BCP_47_PREFIX;
|
||||
import static com.android.tools.klint.client.api.JavaParser.*;
|
||||
|
||||
|
||||
/**
|
||||
@@ -1299,7 +1255,7 @@ public class LintUtils {
|
||||
@Nullable
|
||||
public static UElement skipParentheses(@Nullable UElement element) {
|
||||
while (element instanceof UParenthesizedExpression) {
|
||||
element = element.getContainingElement();
|
||||
element = element.getUastParent();
|
||||
}
|
||||
|
||||
return element;
|
||||
|
||||
@@ -179,7 +179,7 @@ public class AnnotationDetector extends Detector implements Detector.UastScanner
|
||||
}
|
||||
|
||||
if (FQCN_SUPPRESS_LINT.equals(type)) {
|
||||
UElement parent = annotation.getContainingElement();
|
||||
UElement parent = annotation.getUastParent();
|
||||
if (parent == null) {
|
||||
return false;
|
||||
}
|
||||
@@ -218,8 +218,8 @@ public class AnnotationDetector extends Detector implements Detector.UastScanner
|
||||
} else if (type.startsWith(SUPPORT_ANNOTATIONS_PREFIX)) {
|
||||
if (CHECK_RESULT_ANNOTATION.equals(type)) {
|
||||
// Check that the return type of this method is not void!
|
||||
if (annotation.getContainingElement() instanceof UMethod) {
|
||||
UMethod method = (UMethod) annotation.getContainingElement();
|
||||
if (annotation.getUastParent() instanceof UMethod) {
|
||||
UMethod method = (UMethod) annotation.getUastParent();
|
||||
if (!method.isConstructor()
|
||||
&& PsiType.VOID.equals(method.getReturnType())) {
|
||||
mContext.report(ANNOTATION_USAGE, annotation.getPsi(),
|
||||
@@ -284,7 +284,7 @@ public class AnnotationDetector extends Detector implements Detector.UastScanner
|
||||
PERMISSION_ANNOTATION_WRITE.equals(type)) {
|
||||
// Check that if there are no arguments, this is specified on a parameter,
|
||||
// and conversely, on methods and fields there is a valid argument.
|
||||
if (annotation.getContainingElement() instanceof UMethod) {
|
||||
if (annotation.getUastParent() instanceof UMethod) {
|
||||
String value = PermissionRequirement.getAnnotationStringValue(annotation, ATTR_VALUE);
|
||||
String[] anyOf = PermissionRequirement.getAnnotationStringValues(annotation, ATTR_ANY_OF);
|
||||
String[] allOf = PermissionRequirement.getAnnotationStringValues(annotation, ATTR_ALL_OF);
|
||||
@@ -342,7 +342,7 @@ public class AnnotationDetector extends Detector implements Detector.UastScanner
|
||||
|
||||
private void checkTargetType(@NonNull UAnnotation node, @NonNull String type1,
|
||||
@Nullable String type2, boolean allowCollection) {
|
||||
UElement parent = node.getContainingElement();
|
||||
UElement parent = node.getUastParent();
|
||||
PsiType type;
|
||||
|
||||
if (parent instanceof UDeclarationsExpression) {
|
||||
|
||||
@@ -851,7 +851,7 @@ public class ApiDetector extends ResourceXmlDetector
|
||||
|
||||
// It's okay to reference the constant as a case constant (since that
|
||||
// code path won't be taken) or in a condition of an if statement
|
||||
UElement curr = node.getContainingElement();
|
||||
UElement curr = node.getUastParent();
|
||||
while (curr != null) {
|
||||
if (curr instanceof USwitchClauseExpression) {
|
||||
List<UExpression> caseValues = ((USwitchClauseExpression) curr).getCaseValues();
|
||||
@@ -869,7 +869,7 @@ public class ApiDetector extends ResourceXmlDetector
|
||||
} else if (curr instanceof UMethod || curr instanceof UClass) {
|
||||
break;
|
||||
}
|
||||
curr = curr.getContainingElement();
|
||||
curr = curr.getUastParent();
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -1536,7 +1536,7 @@ public class ApiDetector extends ResourceXmlDetector
|
||||
return targetApi;
|
||||
}
|
||||
}
|
||||
scope = scope.getContainingElement();
|
||||
scope = scope.getUastParent();
|
||||
if (scope instanceof PsiFile) {
|
||||
break;
|
||||
}
|
||||
@@ -1730,7 +1730,7 @@ public class ApiDetector extends ResourceXmlDetector
|
||||
int api,
|
||||
JavaContext context
|
||||
) {
|
||||
UElement current = element.getContainingElement();
|
||||
UElement current = element.getUastParent();
|
||||
UElement prev = element;
|
||||
while (current != null) {
|
||||
if (current instanceof UIfExpression) {
|
||||
@@ -1747,7 +1747,7 @@ public class ApiDetector extends ResourceXmlDetector
|
||||
return false;
|
||||
}
|
||||
prev = current;
|
||||
current = current.getContainingElement();
|
||||
current = current.getUastParent();
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
@@ -16,36 +16,28 @@
|
||||
|
||||
package com.android.tools.klint.checks;
|
||||
|
||||
import static com.android.SdkConstants.CLASS_VIEW;
|
||||
import static com.android.SdkConstants.SUPPORT_ANNOTATIONS_PREFIX;
|
||||
import static com.android.tools.klint.checks.SupportAnnotationDetector.filterRelevantAnnotations;
|
||||
import static com.android.tools.klint.detector.api.LintUtils.skipParentheses;
|
||||
|
||||
import com.android.annotations.NonNull;
|
||||
import com.android.annotations.Nullable;
|
||||
import com.android.tools.klint.client.api.JavaEvaluator;
|
||||
import com.android.tools.klint.detector.api.Category;
|
||||
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.Location;
|
||||
import com.android.tools.klint.detector.api.Scope;
|
||||
import com.android.tools.klint.detector.api.Severity;
|
||||
import com.android.tools.klint.detector.api.*;
|
||||
import com.intellij.psi.PsiAnnotation;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiMethod;
|
||||
|
||||
import org.jetbrains.uast.UElement;
|
||||
import org.jetbrains.uast.UMethod;
|
||||
import org.jetbrains.uast.USuperExpression;
|
||||
import org.jetbrains.uast.UReferenceExpression;
|
||||
import org.jetbrains.uast.USuperExpression;
|
||||
import org.jetbrains.uast.visitor.AbstractUastVisitor;
|
||||
import org.jetbrains.uast.visitor.UastVisitor;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import static com.android.SdkConstants.CLASS_VIEW;
|
||||
import static com.android.SdkConstants.SUPPORT_ANNOTATIONS_PREFIX;
|
||||
import static com.android.tools.klint.checks.SupportAnnotationDetector.filterRelevantAnnotations;
|
||||
import static com.android.tools.klint.detector.api.LintUtils.skipParentheses;
|
||||
|
||||
/**
|
||||
* Makes sure that methods call super when overriding methods.
|
||||
*/
|
||||
@@ -185,7 +177,7 @@ public class CallSuperDetector extends Detector implements Detector.UastScanner
|
||||
|
||||
@Override
|
||||
public boolean visitSuperExpression(USuperExpression node) {
|
||||
UElement parent = skipParentheses(node.getContainingElement());
|
||||
UElement parent = skipParentheses(node.getUastParent());
|
||||
if (parent instanceof UReferenceExpression) {
|
||||
PsiElement resolved = ((UReferenceExpression) parent).resolve();
|
||||
if (mMethod.equals(resolved)) {
|
||||
|
||||
@@ -16,54 +16,16 @@
|
||||
|
||||
package com.android.tools.klint.checks;
|
||||
|
||||
import static com.android.SdkConstants.CLASS_CONTENTPROVIDER;
|
||||
import static com.android.SdkConstants.CLASS_CONTEXT;
|
||||
import static com.android.tools.klint.detector.api.LintUtils.skipParentheses;
|
||||
import static org.jetbrains.uast.UastUtils.getOutermostQualified;
|
||||
import static org.jetbrains.uast.UastUtils.getParentOfType;
|
||||
import static org.jetbrains.uast.UastUtils.getQualifiedChain;
|
||||
|
||||
import com.android.SdkConstants;
|
||||
import com.android.annotations.NonNull;
|
||||
import com.android.annotations.Nullable;
|
||||
import com.android.tools.klint.client.api.JavaEvaluator;
|
||||
import com.android.tools.klint.detector.api.Category;
|
||||
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.Location;
|
||||
import com.android.tools.klint.detector.api.Scope;
|
||||
import com.android.tools.klint.detector.api.Severity;
|
||||
import com.android.tools.klint.detector.api.*;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiClassType;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiField;
|
||||
import com.intellij.psi.PsiLocalVariable;
|
||||
import com.intellij.psi.PsiMethod;
|
||||
import com.intellij.psi.PsiType;
|
||||
import com.intellij.psi.PsiVariable;
|
||||
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.util.InheritanceUtil;
|
||||
import com.intellij.util.containers.Predicate;
|
||||
import org.jetbrains.uast.UBinaryExpression;
|
||||
import org.jetbrains.uast.UCallExpression;
|
||||
import org.jetbrains.uast.UDoWhileExpression;
|
||||
import org.jetbrains.uast.UElement;
|
||||
import org.jetbrains.uast.UExpression;
|
||||
import org.jetbrains.uast.UField;
|
||||
import org.jetbrains.uast.UIfExpression;
|
||||
import org.jetbrains.uast.ULocalVariable;
|
||||
import org.jetbrains.uast.UMethod;
|
||||
import org.jetbrains.uast.UQualifiedReferenceExpression;
|
||||
import org.jetbrains.uast.UReturnExpression;
|
||||
import org.jetbrains.uast.UUnaryExpression;
|
||||
import org.jetbrains.uast.UVariable;
|
||||
import org.jetbrains.uast.UWhileExpression;
|
||||
import org.jetbrains.uast.UastCallKind;
|
||||
import org.jetbrains.uast.UastUtils;
|
||||
import org.jetbrains.uast.UReferenceExpression;
|
||||
import org.jetbrains.uast.*;
|
||||
import org.jetbrains.uast.util.UastExpressionUtils;
|
||||
import org.jetbrains.uast.visitor.AbstractUastVisitor;
|
||||
import org.jetbrains.uast.visitor.UastVisitor;
|
||||
@@ -71,6 +33,11 @@ import org.jetbrains.uast.visitor.UastVisitor;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import static com.android.SdkConstants.CLASS_CONTENTPROVIDER;
|
||||
import static com.android.SdkConstants.CLASS_CONTEXT;
|
||||
import static com.android.tools.klint.detector.api.LintUtils.skipParentheses;
|
||||
import static org.jetbrains.uast.UastUtils.*;
|
||||
|
||||
/**
|
||||
* Checks for missing {@code recycle} calls on resources that encourage it, and
|
||||
* for missing {@code commit} calls on FragmentTransactions, etc.
|
||||
@@ -718,10 +685,10 @@ public class CleanupDetector extends Detector implements Detector.UastScanner {
|
||||
// apply if the return value is not considered
|
||||
|
||||
UElement qualifiedNode = node;
|
||||
UElement parent = skipParentheses(node.getContainingElement());
|
||||
UElement parent = skipParentheses(node.getUastParent());
|
||||
while (parent instanceof UReferenceExpression) {
|
||||
qualifiedNode = parent;
|
||||
parent = skipParentheses(parent.getContainingElement());
|
||||
parent = skipParentheses(parent.getUastParent());
|
||||
}
|
||||
boolean returnValueIgnored = true;
|
||||
|
||||
@@ -761,7 +728,7 @@ public class CleanupDetector extends Detector implements Detector.UastScanner {
|
||||
public static PsiVariable getVariableElement(@NonNull UCallExpression rhs,
|
||||
boolean allowChainedCalls) {
|
||||
UElement parent = skipParentheses(
|
||||
UastUtils.getQualifiedParentOrThis(rhs).getContainingElement());
|
||||
UastUtils.getQualifiedParentOrThis(rhs).getUastParent());
|
||||
|
||||
// Handle some types of chained calls; e.g. you might have
|
||||
// var = prefs.edit().put(key,value)
|
||||
@@ -769,9 +736,9 @@ public class CleanupDetector extends Detector implements Detector.UastScanner {
|
||||
if (allowChainedCalls) {
|
||||
while (true) {
|
||||
if ((parent instanceof UQualifiedReferenceExpression)) {
|
||||
UElement parentParent = skipParentheses(parent.getContainingElement());
|
||||
UElement parentParent = skipParentheses(parent.getUastParent());
|
||||
if ((parentParent instanceof UQualifiedReferenceExpression)) {
|
||||
parent = skipParentheses(parentParent.getContainingElement());
|
||||
parent = skipParentheses(parentParent.getUastParent());
|
||||
} else if (parentParent instanceof UVariable
|
||||
|| parentParent instanceof UBinaryExpression) {
|
||||
parent = parentParent;
|
||||
|
||||
+6
-21
@@ -16,36 +16,21 @@
|
||||
|
||||
package com.android.tools.klint.checks;
|
||||
|
||||
import static com.android.SdkConstants.CLASS_CONTEXT;
|
||||
import static com.android.SdkConstants.CLASS_VIEW;
|
||||
import static com.android.SdkConstants.CLASS_VIEWGROUP;
|
||||
import static com.android.SdkConstants.DOT_LAYOUT_PARAMS;
|
||||
import static com.android.SdkConstants.R_STYLEABLE_PREFIX;
|
||||
import static com.android.tools.klint.detector.api.LintUtils.skipParentheses;
|
||||
|
||||
import com.android.annotations.NonNull;
|
||||
import com.android.annotations.Nullable;
|
||||
import com.android.tools.klint.detector.api.Category;
|
||||
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.Scope;
|
||||
import com.android.tools.klint.detector.api.Severity;
|
||||
import com.android.tools.klint.detector.api.*;
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.util.InheritanceUtil;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
|
||||
import org.jetbrains.uast.UCallExpression;
|
||||
import org.jetbrains.uast.UClass;
|
||||
import org.jetbrains.uast.UExpression;
|
||||
import org.jetbrains.uast.UMethod;
|
||||
import org.jetbrains.uast.UastUtils;
|
||||
import org.jetbrains.uast.*;
|
||||
import org.jetbrains.uast.visitor.UastVisitor;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import static com.android.SdkConstants.*;
|
||||
import static com.android.tools.klint.detector.api.LintUtils.skipParentheses;
|
||||
|
||||
/**
|
||||
* Makes sure that custom views use a declare styleable that matches
|
||||
* the name of the custom view
|
||||
@@ -89,7 +74,7 @@ public class CustomViewDetector extends Detector implements Detector.UastScanner
|
||||
@Override
|
||||
public void visitMethod(@NonNull JavaContext context, @Nullable UastVisitor visitor,
|
||||
@NonNull UCallExpression node, @NonNull UMethod method) {
|
||||
if (skipParentheses(node.getContainingElement()) instanceof UExpression) {
|
||||
if (skipParentheses(node.getUastParent()) instanceof UExpression) {
|
||||
if (!context.getEvaluator().isMemberInSubClassOf(method, CLASS_CONTEXT, false)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -139,7 +139,7 @@ public class CutPasteDetector extends Detector implements Detector.UastScanner {
|
||||
|
||||
@Nullable
|
||||
private static String getLhs(@NonNull UCallExpression call) {
|
||||
UElement parent = call.getContainingElement();
|
||||
UElement parent = call.getUastParent();
|
||||
while (parent != null && !(parent instanceof UBlockExpression)) {
|
||||
if (parent instanceof ULocalVariable) {
|
||||
return ((ULocalVariable) parent).getName();
|
||||
@@ -152,7 +152,7 @@ public class CutPasteDetector extends Detector implements Detector.UastScanner {
|
||||
return aa.getReceiver().asSourceString();
|
||||
}
|
||||
}
|
||||
parent = parent.getContainingElement();
|
||||
parent = parent.getUastParent();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@@ -291,7 +291,7 @@ public class CutPasteDetector extends Detector implements Detector.UastScanner {
|
||||
}
|
||||
|
||||
private static UExpression getBreakedExpression(UBreakExpression node) {
|
||||
UElement parent = node.getContainingElement();
|
||||
UElement parent = node.getUastParent();
|
||||
String label = node.getLabel();
|
||||
while (parent != null) {
|
||||
if (label != null) {
|
||||
@@ -306,13 +306,13 @@ public class CutPasteDetector extends Detector implements Detector.UastScanner {
|
||||
return (UExpression) parent;
|
||||
}
|
||||
}
|
||||
parent = parent.getContainingElement();
|
||||
parent = parent.getUastParent();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static UExpression getContinuedExpression(UContinueExpression node) {
|
||||
UElement parent = node.getContainingElement();
|
||||
UElement parent = node.getUastParent();
|
||||
String label = node.getLabel();
|
||||
while (parent != null) {
|
||||
if (label != null) {
|
||||
@@ -327,7 +327,7 @@ public class CutPasteDetector extends Detector implements Detector.UastScanner {
|
||||
return (UExpression) parent;
|
||||
}
|
||||
}
|
||||
parent = parent.getContainingElement();
|
||||
parent = parent.getUastParent();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
+9
-39
@@ -16,51 +16,17 @@
|
||||
|
||||
package com.android.tools.klint.checks;
|
||||
|
||||
import static com.android.SdkConstants.SUPPORT_LIB_ARTIFACT;
|
||||
import static com.android.tools.klint.client.api.JavaParser.TYPE_BOOLEAN;
|
||||
import static com.android.tools.klint.client.api.JavaParser.TYPE_BOOLEAN_WRAPPER;
|
||||
import static com.android.tools.klint.client.api.JavaParser.TYPE_BYTE_WRAPPER;
|
||||
import static com.android.tools.klint.client.api.JavaParser.TYPE_CHARACTER_WRAPPER;
|
||||
import static com.android.tools.klint.client.api.JavaParser.TYPE_DOUBLE_WRAPPER;
|
||||
import static com.android.tools.klint.client.api.JavaParser.TYPE_FLOAT_WRAPPER;
|
||||
import static com.android.tools.klint.client.api.JavaParser.TYPE_INT;
|
||||
import static com.android.tools.klint.client.api.JavaParser.TYPE_INTEGER_WRAPPER;
|
||||
import static com.android.tools.klint.client.api.JavaParser.TYPE_LONG_WRAPPER;
|
||||
import static com.android.tools.klint.detector.api.LintUtils.skipParentheses;
|
||||
|
||||
import com.android.annotations.NonNull;
|
||||
import com.android.annotations.Nullable;
|
||||
import com.android.tools.klint.client.api.JavaEvaluator;
|
||||
import com.android.tools.klint.detector.api.Category;
|
||||
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.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.google.common.collect.Sets;
|
||||
import com.google.common.collect.Sets.SetView;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiField;
|
||||
import com.intellij.psi.PsiMethod;
|
||||
import com.intellij.psi.PsiType;
|
||||
|
||||
import org.jetbrains.uast.UBinaryExpression;
|
||||
import org.jetbrains.uast.UCallExpression;
|
||||
import org.jetbrains.uast.UElement;
|
||||
import org.jetbrains.uast.UExpression;
|
||||
import org.jetbrains.uast.UIfExpression;
|
||||
import org.jetbrains.uast.UMethod;
|
||||
import org.jetbrains.uast.UParenthesizedExpression;
|
||||
import org.jetbrains.uast.UPrefixExpression;
|
||||
import org.jetbrains.uast.UQualifiedReferenceExpression;
|
||||
import org.jetbrains.uast.USimpleNameReferenceExpression;
|
||||
import org.jetbrains.uast.USuperExpression;
|
||||
import org.jetbrains.uast.UThisExpression;
|
||||
import org.jetbrains.uast.UThrowExpression;
|
||||
import org.jetbrains.uast.UastUtils;
|
||||
import org.jetbrains.uast.UReferenceExpression;
|
||||
import org.jetbrains.uast.*;
|
||||
import org.jetbrains.uast.util.UastExpressionUtils;
|
||||
import org.jetbrains.uast.visitor.AbstractUastVisitor;
|
||||
import org.jetbrains.uast.visitor.UastVisitor;
|
||||
@@ -70,6 +36,10 @@ import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
|
||||
import static com.android.SdkConstants.SUPPORT_LIB_ARTIFACT;
|
||||
import static com.android.tools.klint.client.api.JavaParser.*;
|
||||
import static com.android.tools.klint.detector.api.LintUtils.skipParentheses;
|
||||
|
||||
/**
|
||||
* Looks for performance issues in Java files, such as memory allocations during
|
||||
* drawing operations and using HashMap instead of SparseArray.
|
||||
@@ -237,7 +207,7 @@ public class JavaPerformanceDetector extends Detector implements Detector.UastSc
|
||||
}
|
||||
|
||||
if (mFlagAllocations
|
||||
&& !(skipParentheses(node.getContainingElement()) instanceof UThrowExpression)
|
||||
&& !(skipParentheses(node.getUastParent()) instanceof UThrowExpression)
|
||||
&& mCheckAllocations) {
|
||||
// Make sure we're still inside the method declaration that marked
|
||||
// mInDraw as true, in case we've left it and we're in a static
|
||||
@@ -316,7 +286,7 @@ public class JavaPerformanceDetector extends Detector implements Detector.UastSc
|
||||
* </pre>
|
||||
*/
|
||||
private static boolean isLazilyInitialized(UElement node) {
|
||||
UElement curr = node.getContainingElement();
|
||||
UElement curr = node.getUastParent();
|
||||
while (curr != null) {
|
||||
if (curr instanceof UMethod) {
|
||||
return false;
|
||||
@@ -347,7 +317,7 @@ public class JavaPerformanceDetector extends Detector implements Detector.UastSc
|
||||
return false;
|
||||
|
||||
}
|
||||
curr = curr.getContainingElement();
|
||||
curr = curr.getUastParent();
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
@@ -16,36 +16,18 @@
|
||||
|
||||
package com.android.tools.klint.checks;
|
||||
|
||||
import static com.android.tools.klint.client.api.JavaParser.TYPE_STRING;
|
||||
|
||||
import com.android.annotations.NonNull;
|
||||
import com.android.annotations.Nullable;
|
||||
import com.android.tools.klint.client.api.JavaEvaluator;
|
||||
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.Location;
|
||||
import com.android.tools.klint.detector.api.Scope;
|
||||
import com.android.tools.klint.detector.api.Severity;
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiNamedElement;
|
||||
import com.intellij.psi.PsiParameterList;
|
||||
import com.intellij.psi.PsiVariable;
|
||||
|
||||
import com.android.tools.klint.detector.api.*;
|
||||
import com.intellij.psi.*;
|
||||
import org.jetbrains.uast.*;
|
||||
import org.jetbrains.uast.visitor.UastVisitor;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
|
||||
import static com.android.tools.klint.client.api.JavaParser.TYPE_STRING;
|
||||
|
||||
/**
|
||||
* Detector for finding inefficiencies and errors in logging calls.
|
||||
@@ -142,7 +124,7 @@ public class LogDetector extends Detector implements Detector.UastScanner {
|
||||
|
||||
String name = method.getName();
|
||||
boolean withinConditional = IS_LOGGABLE.equals(name) ||
|
||||
checkWithinConditional(context, node.getContainingElement(), node);
|
||||
checkWithinConditional(context, node.getUastParent(), node);
|
||||
|
||||
// See if it's surrounded by an if statement (and it's one of the non-error, spammy
|
||||
// log methods (info, verbose, etc))
|
||||
@@ -249,7 +231,7 @@ public class LogDetector extends Detector implements Detector.UastScanner {
|
||||
|| curr instanceof UClass) { // static block
|
||||
break;
|
||||
}
|
||||
curr = curr.getContainingElement();
|
||||
curr = curr.getUastParent();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
+5
-18
@@ -17,28 +17,13 @@
|
||||
package com.android.tools.klint.checks;
|
||||
|
||||
|
||||
import static com.android.tools.klint.checks.CutPasteDetector.isReachableFrom;
|
||||
|
||||
import com.android.annotations.NonNull;
|
||||
import com.android.annotations.Nullable;
|
||||
import com.android.tools.klint.client.api.JavaEvaluator;
|
||||
import com.android.tools.klint.detector.api.Category;
|
||||
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.Scope;
|
||||
import com.android.tools.klint.detector.api.Severity;
|
||||
import com.android.tools.klint.detector.api.*;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Maps;
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiField;
|
||||
import com.intellij.psi.PsiLocalVariable;
|
||||
import com.intellij.psi.PsiMethod;
|
||||
import com.intellij.psi.PsiParameter;
|
||||
import com.intellij.psi.PsiVariable;
|
||||
|
||||
import com.intellij.psi.*;
|
||||
import org.jetbrains.uast.*;
|
||||
import org.jetbrains.uast.util.UastExpressionUtils;
|
||||
import org.jetbrains.uast.visitor.AbstractUastVisitor;
|
||||
@@ -47,6 +32,8 @@ import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static com.android.tools.klint.checks.CutPasteDetector.isReachableFrom;
|
||||
|
||||
/**
|
||||
* Checks related to RecyclerView usage.
|
||||
*/
|
||||
@@ -171,7 +158,7 @@ public class RecyclerViewDetector extends Detector implements Detector.UastScann
|
||||
// want
|
||||
UExpression statement = UastUtils.getParentOfType(reference, UExpression.class, true);
|
||||
if (statement != null) {
|
||||
parentToChildren.put(statement.getContainingElement(), reference);
|
||||
parentToChildren.put(statement.getUastParent(), reference);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -79,7 +79,7 @@ public class ServiceCastDetector extends Detector implements Detector.UastScanne
|
||||
public void visitMethod(@NonNull JavaContext context, @Nullable UastVisitor visitor,
|
||||
@NonNull UCallExpression call, @NonNull UMethod method) {
|
||||
UElement parent = LintUtils.skipParentheses(
|
||||
UastUtils.getQualifiedParentOrThis(call).getContainingElement());
|
||||
UastUtils.getQualifiedParentOrThis(call).getUastParent());
|
||||
if (UastExpressionUtils.isTypeCast(parent)) {
|
||||
UBinaryExpressionWithType cast = (UBinaryExpressionWithType) parent;
|
||||
|
||||
|
||||
+1
-1
@@ -734,7 +734,7 @@ public class SupportAnnotationDetector extends Detector implements Detector.Uast
|
||||
}
|
||||
|
||||
private static boolean isExpressionValueUnused(UExpression expression) {
|
||||
return getQualifiedParentOrThis(expression).getContainingElement()
|
||||
return getQualifiedParentOrThis(expression).getUastParent()
|
||||
instanceof UBlockExpression;
|
||||
}
|
||||
|
||||
|
||||
@@ -16,14 +16,6 @@
|
||||
|
||||
package com.android.tools.klint.checks;
|
||||
|
||||
import static com.android.SdkConstants.ANDROID_URI;
|
||||
import static com.android.SdkConstants.ATTR_CLASS;
|
||||
import static com.android.SdkConstants.ATTR_ID;
|
||||
import static com.android.SdkConstants.DOT_XML;
|
||||
import static com.android.SdkConstants.ID_PREFIX;
|
||||
import static com.android.SdkConstants.NEW_ID_PREFIX;
|
||||
import static com.android.SdkConstants.VIEW_TAG;
|
||||
|
||||
import com.android.annotations.NonNull;
|
||||
import com.android.annotations.Nullable;
|
||||
import com.android.ide.common.res2.AbstractResourceRepository;
|
||||
@@ -33,51 +25,20 @@ import com.android.ide.common.resources.ResourceUrl;
|
||||
import com.android.resources.ResourceFolderType;
|
||||
import com.android.resources.ResourceType;
|
||||
import com.android.tools.klint.client.api.LintClient;
|
||||
import com.android.tools.klint.detector.api.Category;
|
||||
import com.android.tools.klint.detector.api.Context;
|
||||
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.LintUtils;
|
||||
import com.android.tools.klint.detector.api.ResourceEvaluator;
|
||||
import com.android.tools.klint.detector.api.ResourceXmlDetector;
|
||||
import com.android.tools.klint.detector.api.Scope;
|
||||
import com.android.tools.klint.detector.api.Severity;
|
||||
import com.android.tools.klint.detector.api.Speed;
|
||||
import com.android.tools.klint.detector.api.XmlContext;
|
||||
import com.android.tools.klint.detector.api.*;
|
||||
import com.android.utils.XmlUtils;
|
||||
import com.google.common.base.Joiner;
|
||||
import com.google.common.collect.ArrayListMultimap;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Maps;
|
||||
import com.google.common.collect.Multimap;
|
||||
import com.google.common.collect.Sets;
|
||||
import com.google.common.collect.*;
|
||||
import com.intellij.psi.PsiClassType;
|
||||
import com.intellij.psi.PsiType;
|
||||
|
||||
import org.jetbrains.uast.UBinaryExpressionWithType;
|
||||
import org.jetbrains.uast.UCallExpression;
|
||||
import org.jetbrains.uast.UElement;
|
||||
import org.jetbrains.uast.UExpression;
|
||||
import org.jetbrains.uast.UMethod;
|
||||
import org.jetbrains.uast.UParenthesizedExpression;
|
||||
import org.jetbrains.uast.*;
|
||||
import org.jetbrains.uast.visitor.UastVisitor;
|
||||
import org.w3c.dom.Attr;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.Node;
|
||||
import org.w3c.dom.NodeList;
|
||||
import org.w3c.dom.*;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.EnumSet;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
|
||||
import static com.android.SdkConstants.*;
|
||||
|
||||
/** Detector for finding inconsistent usage of views and casts
|
||||
* <p>
|
||||
@@ -189,11 +150,11 @@ public class ViewTypeDetector extends ResourceXmlDetector implements Detector.Ua
|
||||
}
|
||||
assert method.getName().equals("findViewById");
|
||||
UElement node = LintUtils.skipParentheses(call);
|
||||
while (node != null && node.getContainingElement() instanceof UParenthesizedExpression) {
|
||||
node = node.getContainingElement();
|
||||
while (node != null && node.getUastParent() instanceof UParenthesizedExpression) {
|
||||
node = node.getUastParent();
|
||||
}
|
||||
if (node.getContainingElement() instanceof UBinaryExpressionWithType) {
|
||||
UBinaryExpressionWithType cast = (UBinaryExpressionWithType) node.getContainingElement();
|
||||
if (node.getUastParent() instanceof UBinaryExpressionWithType) {
|
||||
UBinaryExpressionWithType cast = (UBinaryExpressionWithType) node.getUastParent();
|
||||
PsiType type = cast.getType();
|
||||
String castType = null;
|
||||
if (type instanceof PsiClassType) {
|
||||
|
||||
+1
-1
@@ -261,7 +261,7 @@ public class IntellijLintUtils {
|
||||
}
|
||||
}
|
||||
}
|
||||
element = element.getContainingElement();
|
||||
element = element.getUastParent();
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user