diff --git a/java/src/com/github/bazel_contrib/contrib_rules_jvm/javaparser/generators/ClasspathParser.java b/java/src/com/github/bazel_contrib/contrib_rules_jvm/javaparser/generators/ClasspathParser.java index b4d7d2d6..ecbb7c01 100644 --- a/java/src/com/github/bazel_contrib/contrib_rules_jvm/javaparser/generators/ClasspathParser.java +++ b/java/src/com/github/bazel_contrib/contrib_rules_jvm/javaparser/generators/ClasspathParser.java @@ -416,16 +416,35 @@ private void handleAnnotations(List annotations) { public Void visitMethodInvocation(MethodInvocationTree node, Void v) { if (node.getMethodSelect() instanceof MemberSelectTree) { ExpressionTree container = ((MemberSelectTree) node.getMethodSelect()).getExpression(); - if (container instanceof MemberSelectTree) { - MemberSelectTree containerMST = (MemberSelectTree) container; - if (looksLikeClassName(containerMST.getIdentifier().toString())) { - checkFullyQualifiedType(container); - } - } + maybeRecordMethodReceiverType(container); } return super.visitMethodInvocation(node, v); } + private void maybeRecordMethodReceiverType(ExpressionTree container) { + String receiverTypeName = methodReceiverTypeName(container); + if (receiverTypeName == null) { + return; + } + // Imported identifiers are known types even when they are acronym-style + // names (for example UUID), which our heuristic would otherwise reject. + if (currentFileImports.containsKey(receiverTypeName) + || looksLikeClassName(receiverTypeName)) { + checkFullyQualifiedType(container); + } + } + + @Nullable + private String methodReceiverTypeName(ExpressionTree container) { + if (container instanceof MemberSelectTree) { + return ((MemberSelectTree) container).getIdentifier().toString(); + } + if (container.getKind() == Tree.Kind.IDENTIFIER) { + return container.toString(); + } + return null; + } + private boolean looksLikeClassName(String identifier) { if (identifier.isEmpty()) { return false; diff --git a/java/test/com/github/bazel_contrib/contrib_rules_jvm/javaparser/generators/ClasspathParserTest.java b/java/test/com/github/bazel_contrib/contrib_rules_jvm/javaparser/generators/ClasspathParserTest.java index efeadb81..eae712ed 100644 --- a/java/test/com/github/bazel_contrib/contrib_rules_jvm/javaparser/generators/ClasspathParserTest.java +++ b/java/test/com/github/bazel_contrib/contrib_rules_jvm/javaparser/generators/ClasspathParserTest.java @@ -449,6 +449,28 @@ public void testSamePackageAllTypePositions() throws IOException { parser.getUsedTypes()); } + @Test + public void testSamePackageStaticMethodCall() throws IOException { + List files = + List.of( + testFiles.get( + "/workspace/com/gazelle/java/javaparser/generators/SamePackageStaticCall.java")); + parser.parseClasses(files); + assertEquals( + Set.of("workspace.com.gazelle.java.javaparser.generators.ExternalFactory"), + parser.getUsedTypes()); + } + + @Test + public void testImportedAcronymStaticMethodCall() throws IOException { + List files = + List.of( + testFiles.get( + "/workspace/com/gazelle/java/javaparser/generators/ImportedAcronymStaticCall.java")); + parser.parseClasses(files); + assertEquals(Set.of("java.util.UUID"), parser.getUsedTypes()); + } + private TreeSet treeSet(T... values) { return new TreeSet<>(Arrays.asList(values)); } diff --git a/java/test/com/github/bazel_contrib/contrib_rules_jvm/javaparser/generators/workspace/com/gazelle/java/javaparser/generators/ImportedAcronymStaticCall.java b/java/test/com/github/bazel_contrib/contrib_rules_jvm/javaparser/generators/workspace/com/gazelle/java/javaparser/generators/ImportedAcronymStaticCall.java new file mode 100644 index 00000000..c09cd00c --- /dev/null +++ b/java/test/com/github/bazel_contrib/contrib_rules_jvm/javaparser/generators/workspace/com/gazelle/java/javaparser/generators/ImportedAcronymStaticCall.java @@ -0,0 +1,7 @@ +package workspace.com.gazelle.java.javaparser.generators; + +import java.util.UUID; + +public class ImportedAcronymStaticCall { + Object id = UUID.randomUUID(); +} diff --git a/java/test/com/github/bazel_contrib/contrib_rules_jvm/javaparser/generators/workspace/com/gazelle/java/javaparser/generators/SamePackageStaticCall.java b/java/test/com/github/bazel_contrib/contrib_rules_jvm/javaparser/generators/workspace/com/gazelle/java/javaparser/generators/SamePackageStaticCall.java new file mode 100644 index 00000000..13b4f09f --- /dev/null +++ b/java/test/com/github/bazel_contrib/contrib_rules_jvm/javaparser/generators/workspace/com/gazelle/java/javaparser/generators/SamePackageStaticCall.java @@ -0,0 +1,6 @@ +package workspace.com.gazelle.java.javaparser.generators; + +public class SamePackageStaticCall { + Object result = ExternalFactory.create(42); + Object other = ExternalFactory.build("test", new Object()); +}