diff --git a/checker/src/main/java/org/checkerframework/checker/regex/RegexAnnotatedTypeFactory.java b/checker/src/main/java/org/checkerframework/checker/regex/RegexAnnotatedTypeFactory.java index 4156498c41db..f7033afc01dd 100644 --- a/checker/src/main/java/org/checkerframework/checker/regex/RegexAnnotatedTypeFactory.java +++ b/checker/src/main/java/org/checkerframework/checker/regex/RegexAnnotatedTypeFactory.java @@ -112,6 +112,14 @@ public class RegexAnnotatedTypeFactory extends BaseAnnotatedTypeFactory { private final ExecutableElement patternCompile = TreeUtils.getMethod("java.util.regex.Pattern", "compile", 1, processingEnv); + /** + * The Pattern.compile method that takes two formal parameters (second one is flags). + * + * @see java.util.regex.Pattern#compile(String, int) + */ + private final ExecutableElement patternCompile2 = + TreeUtils.getMethod("java.util.regex.Pattern", "compile", 2, processingEnv); + /** * Create a new RegexAnnotatedTypeFactory. * @@ -417,7 +425,8 @@ public Void visitCompoundAssignment(CompoundAssignmentTree node, AnnotatedTypeMi @Override public Void visitMethodInvocation(MethodInvocationTree tree, AnnotatedTypeMirror type) { // TODO: Also get this to work with 2 argument Pattern.compile. - if (TreeUtils.isMethodInvocation(tree, patternCompile, processingEnv)) { + if (TreeUtils.isMethodInvocation(tree, patternCompile, processingEnv) + || TreeUtils.isMethodInvocation(tree, patternCompile2, processingEnv)) { ExpressionTree arg0 = tree.getArguments().get(0); final AnnotatedTypeMirror argType = getAnnotatedType(arg0); diff --git a/checker/tests/regex/GroupCounts.java b/checker/tests/regex/GroupCounts.java index ae0ed9053016..917af13af0e1 100644 --- a/checker/tests/regex/GroupCounts.java +++ b/checker/tests/regex/GroupCounts.java @@ -28,18 +28,25 @@ void testGroupCount() { void testPatternCompileGroupCount(@Regex String r, @Regex(3) String r3, @Regex(5) String r5) { @Regex(5) Pattern p1 = Pattern.compile(r5); + @Regex(5) Pattern p1a = Pattern.compile(r5, 0); @Regex Pattern p2 = Pattern.compile(r5); @Regex Pattern p3 = Pattern.compile(r); // :: error: (assignment) @Regex(6) Pattern p4 = Pattern.compile(r5); // error // :: error: (assignment) + @Regex(6) Pattern p4a = Pattern.compile(r5, 0); // error + // :: error: (assignment) @Regex(6) Pattern p5 = Pattern.compile(r3); // error + // :: error: (assignment) + @Regex(6) Pattern p5a = Pattern.compile(r3, 0); // error // Make sure Pattern.compile still works when passed an @UnknownRegex String // that's actually a regex, with the warning suppressed. @SuppressWarnings("regex:argument") Pattern p6 = Pattern.compile("(" + r + ")"); + @SuppressWarnings("regex:argument") + Pattern p6a = Pattern.compile("(" + r + ")", 0); } void testConcatenationGroupCount(@Regex String r, @Regex(3) String r3, @Regex(5) String r5) {