@Override public UElementHandler createUastHandler(final JavaContext context) { final JavaEvaluator evaluator = context.getEvaluator();
@Override public UElementHandler createUastHandler(final JavaContext context) { final JavaEvaluator evaluator = context.getEvaluator();
private boolean isInJob(PsiField field) { JavaEvaluator evaluator = context.getEvaluator(); if (evaluator.isMemberInSubClassOf(field, JOBQUEUE_JOB, true)) { return true; } return false; }
@NonNull @Override public JavaEvaluator getEvaluator() { return context.getEvaluator(); } }
/** * Returns true if this method looks like it's overriding android.widget.Adapter's getView * method: getView(int position, View convertView, ViewGroup parent) */ private static boolean isViewAdapterMethod(JavaContext context, PsiMethod node) { JavaEvaluator evaluator = context.getEvaluator(); return GET_VIEW.equals(node.getName()) && evaluator.parametersMatch(node, TYPE_INT, CLASS_VIEW, CLASS_VIEWGROUP); } }
@Override public void visitMethod(PsiMethod method) { super.visitMethod(method); if (METHOD_MEDIA_SESSION_PLAY_FROM_SEARCH.equals(method.getName()) && mContext.getEvaluator().parametersMatch(method, TYPE_STRING, BUNDLE_ARG)) { mOnPlayFromSearchFound = true; } } }
@Override public void visitMethod(JavaContext context, UCallExpression node, PsiMethod method) { if (context.getEvaluator().isMemberInClass(method, "android.util.Log")) { context.report(ISSUE, node, context.getLocation(node), ISSUE_DESCRIPTION); } } }
private static boolean isSharedEditorCreation(@NonNull JavaContext context, @NonNull PsiMethod method) { String methodName = method.getName(); if (EDIT.equals(methodName)) { PsiClass containingClass = method.getContainingClass(); JavaEvaluator evaluator = context.getEvaluator(); return evaluator.extendsClass(containingClass, ANDROID_CONTENT_SHARED_PREFERENCES, false); } return false; }
private static boolean isHolderConstructionMethod(@NonNull JavaContext context, @NonNull PsiMethodCallExpression callExpression) { String referenceName = callExpression.getMethodExpression().getReferenceName(); if (referenceName != null && referenceName.startsWith("of")) { PsiMethod resolved = callExpression.resolveMethod(); if (resolved != null && context.getEvaluator().isMemberInClass(resolved, "android.animation.PropertyValuesHolder")) { return true; } } return false; }
private static boolean isBeginTransaction(@NonNull JavaContext context, @NonNull PsiMethod method) { String methodName = method.getName(); if (BEGIN_TRANSACTION.equals(methodName)) { PsiClass containingClass = method.getContainingClass(); JavaEvaluator evaluator = context.getEvaluator(); if (evaluator.extendsClass(containingClass, FRAGMENT_MANAGER_CLS, false) || evaluator.extendsClass(containingClass, FRAGMENT_MANAGER_V4_CLS, false)) { return true; } } return false; }
/** * Returns whether the given method declaration represents a method * where allocating objects is not allowed for performance reasons */ private boolean isBlockedAllocationMethod( @NonNull PsiMethod node) { JavaEvaluator evaluator = mContext.getEvaluator(); return isOnDrawMethod(evaluator, node) || isOnMeasureMethod(evaluator, node) || isOnLayoutMethod(evaluator, node) || isLayoutMethod(evaluator, node); }
@Override public void visitMethod(@NonNull JavaContext context, @Nullable JavaElementVisitor visitor, @NonNull PsiMethodCallExpression call, @NonNull PsiMethod method) { // Identify calls to Runtime.loadLibrary() and System.loadLibrary() if (LOAD_LIBRARY.equals(method.getName())) { JavaEvaluator evaluator = context.getEvaluator(); if (evaluator.isMemberInSubClassOf(method, RUNTIME_CLASS, false) || evaluator.isMemberInSubClassOf(method, SYSTEM_CLASS, false)) { mHasNativeLibs = true; } } }
@Override public void checkClass(@NonNull JavaContext context, @NonNull PsiClass declaration) { JavaEvaluator evaluator = context.getEvaluator(); for (PsiMethod method : declaration.findMethodsByName(ON_BIND_VIEW_HOLDER, false)) { int size = evaluator.getParameterCount(method); if (size == 2 || size == 3) { checkMethod(context, method, declaration); } } }
private void checkClassType( @NonNull PsiElement element, @NonNull PsiClassType classType, @Nullable String descriptor) { String owner = mContext.getEvaluator().getInternalName(classType); String fqcn = classType.getCanonicalText(); if (owner != null && fqcn != null) { checkClass(element, descriptor, owner, fqcn); } }
@Override public void checkClass(@NonNull JavaContext context, @NonNull PsiClass declaration) { if (declaration.getName() == null) { return; } // In case linting the base class itself. if (!context.getEvaluator().extendsClass(declaration, CLASS_ACTIVITY, true)) { return; } declaration.accept(new MethodVisitor(context, declaration)); }
private static boolean isAppBarActivityCall(@NonNull JavaContext context, @NonNull PsiMethodCallExpression node, @NonNull PsiMethod method) { JavaEvaluator evaluator = context.getEvaluator(); if (evaluator.isMemberInSubClassOf(method, CLASS_ACTIVITY, false)) { // Make sure that the calling context is a subclass of ActionBarActivity; // we don't want to flag these calls if they are in non-appcompat activities // such as PreferenceActivity (see b.android.com/58512) PsiClass cls = PsiTreeUtil.getParentOfType(node, PsiClass.class, true); return cls != null && evaluator.extendsClass(cls, "android.support.v7.app.ActionBarActivity", false); } return false; }
private void checkClass( @NonNull PsiElement element, @NonNull PsiClass cls, @Nullable String descriptor) { String owner = mContext.getEvaluator().getInternalName(cls); if (owner == null) { return; } String fqcn = cls.getQualifiedName(); if (fqcn != null) { checkClass(element, descriptor, owner, fqcn); } }
@Override public void visitMethod(@NonNull JavaContext context, @Nullable JavaElementVisitor visitor, @NonNull PsiMethodCallExpression node, @NonNull PsiMethod method) { JavaEvaluator evaluator = context.getEvaluator(); if (evaluator.isMemberInClass(method, "android.app.AlarmManager") && evaluator.getParameterCount(method) == 4) { ensureAtLeast(context, node, 1, 5000L); ensureAtLeast(context, node, 2, 60000L); } }
@Override public void visitMethod(@NonNull JavaContext context, @Nullable JavaElementVisitor visitor, @NonNull PsiMethodCallExpression call, @NonNull PsiMethod method) { JavaEvaluator evaluator = context.getEvaluator(); if (!evaluator.isMemberInSubClassOf(method, TEXT_VIEW_CLS, false)) { return; } if (method.getParameterList().getParametersCount() > 0 && evaluator.parameterHasType(method, 0, CHAR_SEQUENCE_CLS)) { checkNode(context, call.getArgumentList().getExpressions()[0]); } }
@Override public void visitReference(@NonNull JavaContext context, @Nullable JavaElementVisitor visitor, @NonNull PsiJavaCodeReferenceElement reference, @NonNull PsiElement resolved) { if (resolved instanceof PsiField && context.getEvaluator().isMemberInSubClassOf((PsiField)resolved, "android.provider.Settings", false) && context.getMainProject().getTargetSdkVersion().getFeatureLevel() >= 23) { String message = getBatteryOptimizationsErrorMessage(); context.report(ISSUE, reference, context.getNameLocation(reference), message); } }