int index = 0; boolean matches = true; for (int i = 0, n = method.getArgumentCount(); i < n; i++) { String parameterType = method.getArgumentType(i).getSignature(); int length = parameterType.indexOf('<');
private static boolean overridesIsValidFragment(ResolvedClass resolvedClass) { Iterable<ResolvedMethod> resolvedMethods = resolvedClass.getMethods(IS_VALID_FRAGMENT, false); for (ResolvedMethod resolvedMethod : resolvedMethods) { if (resolvedMethod.getArgumentCount() == 1 && resolvedMethod.getArgumentType(0).getName().equals(TYPE_STRING)) { return true; } } return false; } }
if (method.getArgumentCount() > tagArgumentIndex && method.getArgumentType(tagArgumentIndex).matchesSignature(TYPE_STRING) && node.astArguments().size() == method.getArgumentCount()) { Iterator<Expression> iterator = node.astArguments().iterator(); if (tagArgumentIndex == 1) {
if (method.getArgumentCount() != 1) { continue; // Wrong signature
for (int i = 0, n = method.getArgumentCount(); i < n && arguments.hasNext(); i++) {
if (cls != null) { String methodName = getName(); int argCount = getArgumentCount(); for (ResolvedMethod method : cls.getMethods(methodName, true)) { if (argCount != method.getArgumentCount()) { continue;
if (method.getArgumentCount() > 0 && method.getArgumentType(0).matchesSignature(TYPE_STRING) && node.astArguments().size() == method.getArgumentCount()) { Iterator<Expression> iterator = node.astArguments().iterator(); Node argument = iterator.next();
@Override public void visitMethod(@NonNull JavaContext context, @Nullable AstVisitor visitor, @NonNull MethodInvocation node) { // Ignore the issue if we never build for any API less than 17. if (context.getMainProject().getMinSdk() >= 17) { return; } // Ignore if the method doesn't fit our description. ResolvedNode resolved = context.resolve(node); if (!(resolved instanceof ResolvedMethod)) { return; } ResolvedMethod method = (ResolvedMethod) resolved; if (!method.getContainingClass().isSubclassOf(WEB_VIEW, false)) { return; } if (method.getArgumentCount() != 2 || !method.getArgumentType(0).matchesName(TYPE_OBJECT) || !method.getArgumentType(1).matchesName(TYPE_STRING)) { return; } String message = "`WebView.addJavascriptInterface` should not be called with minSdkVersion < 17 for security reasons: " + "JavaScript can use reflection to manipulate application"; context.report(ISSUE, node, context.getLocation(node.astName()), message); } }
private static boolean isXmlConstructor(ResolvedMethod method) { // Accept // android.content.Context // android.content.Context,android.util.AttributeSet // android.content.Context,android.util.AttributeSet,int int argumentCount = method.getArgumentCount(); if (argumentCount == 0 || argumentCount > 3) { return false; } if (!method.getArgumentType(0).matchesName(CLASS_CONTEXT)) { return false; } if (argumentCount == 1) { return true; } if (!method.getArgumentType(1).matchesName(CLASS_ATTRIBUTE_SET)) { return false; } //noinspection SimplifiableIfStatement if (argumentCount == 2) { return true; } return method.getArgumentType(2).matchesName("int"); }
private static boolean specifiesLocale(@NonNull ResolvedMethod method) { for (int i = 0, n = method.getArgumentCount(); i < n; i++) { TypeDescriptor argumentType = method.getArgumentType(i); if (argumentType.matchesSignature(LOCALE_CLS)) { return true; } } return false; } }
private static boolean hasLooperConstructorParameter(@NonNull ResolvedClass cls) { for (ResolvedMethod constructor : cls.getConstructors()) { for (int i = 0, n = constructor.getArgumentCount(); i < n; i++) { TypeDescriptor type = constructor.getArgumentType(i); if (type.matchesSignature(LOOPER_CLS)) { return true; } } } return false; } }
@Override public void visitMethod(@NonNull JavaContext context, @Nullable AstVisitor visitor, @NonNull MethodInvocation node) { ResolvedNode resolved = context.resolve(node); if (resolved instanceof ResolvedMethod) { ResolvedMethod method = (ResolvedMethod) resolved; if (method.getContainingClass().matches("android.app.AlarmManager") && method.getArgumentCount() == 4) { ensureAtLeast(context, node, 1, 5000L); ensureAtLeast(context, node, 2, 60000L); } } }