Skip to content

Commit 8e73b1f

Browse files
authored
[gazelle] Normalise ClasspathParser to return ParsedPackageData directly (#444)
Make `ClasspathParser.parseClasses()` return `ParsedPackageData` instead of requiring callers to mutate internal state and call `getParsedPackageData()`. This aligns the Java parser API with the Kotlin parser, which already returns `ParsedPackageData` directly.
1 parent 12b3696 commit 8e73b1f

3 files changed

Lines changed: 106 additions & 131 deletions

File tree

java/src/com/github/bazel_contrib/contrib_rules_jvm/javaparser/generators/ClasspathParser.java

Lines changed: 47 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
import com.google.common.base.Joiner;
88
import com.google.common.base.Splitter;
9-
import com.google.common.collect.ImmutableSet;
109
import com.google.common.collect.Lists;
1110
import com.sun.source.tree.AnnotationTree;
1211
import com.sun.source.tree.ArrayTypeTree;
@@ -149,8 +148,6 @@ public class ClasspathParser {
149148
"SafeVarargs",
150149
"SuppressWarnings");
151150

152-
private final ParsedPackageData data = new ParsedPackageData();
153-
154151
// get the system java compiler instance
155152
private static final JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
156153
private static final List<String> OPTIONS =
@@ -160,31 +157,7 @@ public ClasspathParser() {
160157
// Doesn't need to do anything currently
161158
}
162159

163-
public ParsedPackageData getParsedPackageData() {
164-
return data;
165-
}
166-
167-
public ImmutableSet<String> getUsedTypes() {
168-
return ImmutableSet.copyOf(data.usedTypes);
169-
}
170-
171-
public ImmutableSet<String> getUsedPackagesWithoutSpecificTypes() {
172-
return ImmutableSet.copyOf(data.usedPackagesWithoutSpecificTypes);
173-
}
174-
175-
public ImmutableSet<String> getExportedTypes() {
176-
return ImmutableSet.copyOf(data.exportedTypes);
177-
}
178-
179-
public ImmutableSet<String> getPackages() {
180-
return ImmutableSet.copyOf(data.packages);
181-
}
182-
183-
public ImmutableSet<String> getMainClasses() {
184-
return ImmutableSet.copyOf(data.mainClasses);
185-
}
186-
187-
public void parseClasses(Path directory, List<String> files) throws IOException {
160+
public ParsedPackageData parseClasses(Path directory, List<String> files) throws IOException {
188161
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
189162
List<? extends JavaFileObject> objectFiles =
190163
files.stream()
@@ -202,18 +175,19 @@ public void parseClasses(Path directory, List<String> files) throws IOException
202175
logger.debug("JavaTools: No files given to parse, skipping directory: {}", directory);
203176
throw new IOException("No files to process");
204177
}
205-
parseFileGatherDependencies(objectFiles);
178+
return parseFileGatherDependencies(objectFiles);
206179
}
207180

208-
public void parseClasses(List<? extends JavaFileObject> files) throws IOException {
209-
this.parseFileGatherDependencies(files);
181+
public ParsedPackageData parseClasses(List<? extends JavaFileObject> files) throws IOException {
182+
return parseFileGatherDependencies(files);
210183
}
211184

212-
private void parseFileGatherDependencies(Iterable<? extends JavaFileObject> compUnits)
213-
throws IOException {
185+
private ParsedPackageData parseFileGatherDependencies(
186+
Iterable<? extends JavaFileObject> compUnits) throws IOException {
187+
ParsedPackageData data = new ParsedPackageData();
214188
JavacTask task = (JavacTask) compiler.getTask(null, null, null, OPTIONS, null, compUnits);
215189
try {
216-
ClassScanner scanner = new ClassScanner();
190+
ClassScanner scanner = new ClassScanner(data);
217191
for (CompilationUnitTree compileUnitTree : task.parse()) {
218192
compileUnitTree.accept(scanner, null);
219193
}
@@ -223,13 +197,19 @@ private void parseFileGatherDependencies(Iterable<? extends JavaFileObject> comp
223197
} catch (Exception exception) {
224198
logger.error("JavaTools failed to parse {}, skipping file", compUnits, exception);
225199
}
200+
return data;
226201
}
227202

228203
class ClassScanner extends TreeScanner<Void, Void> {
204+
private final ParsedPackageData data;
229205
private CompilationUnitTree compileUnit;
230206
private String fileName;
231207
@Nullable private String currentPackage;
232208

209+
ClassScanner(ParsedPackageData data) {
210+
this.data = data;
211+
}
212+
233213
// Stack of possibly-nested contexts we may currently be in.
234214
// First element is the outer-most context (e.g. top-level class), last element is the
235215
// inner-most context (e.g. inner class).
@@ -563,44 +543,44 @@ private String currentFullyQualifiedClassName() {
563543
parts.add(nestedClassName);
564544
return Joiner.on('.').join(parts);
565545
}
566-
}
567546

568-
private void noteAnnotatedClass(
569-
String annotatedFullyQualifiedClassName, String annotationFullyQualifiedClassName) {
570-
if (!data.perClassData.containsKey(annotatedFullyQualifiedClassName)) {
571-
data.perClassData.put(annotatedFullyQualifiedClassName, new PerClassData());
547+
private void noteAnnotatedClass(
548+
String annotatedFullyQualifiedClassName, String annotationFullyQualifiedClassName) {
549+
if (!data.perClassData.containsKey(annotatedFullyQualifiedClassName)) {
550+
data.perClassData.put(annotatedFullyQualifiedClassName, new PerClassData());
551+
}
552+
data.perClassData
553+
.get(annotatedFullyQualifiedClassName)
554+
.annotations
555+
.add(annotationFullyQualifiedClassName);
572556
}
573-
data.perClassData
574-
.get(annotatedFullyQualifiedClassName)
575-
.annotations
576-
.add(annotationFullyQualifiedClassName);
577-
}
578557

579-
private void noteAnnotatedMethod(
580-
String annotatedFullyQualifiedClassName,
581-
String methodName,
582-
String annotationFullyQualifiedClassName) {
583-
if (!data.perClassData.containsKey(annotatedFullyQualifiedClassName)) {
584-
data.perClassData.put(annotatedFullyQualifiedClassName, new PerClassData());
585-
}
586-
PerClassData classData = data.perClassData.get(annotatedFullyQualifiedClassName);
587-
if (!classData.perMethodAnnotations.containsKey(methodName)) {
588-
classData.perMethodAnnotations.put(methodName, new TreeSet<>());
558+
private void noteAnnotatedMethod(
559+
String annotatedFullyQualifiedClassName,
560+
String methodName,
561+
String annotationFullyQualifiedClassName) {
562+
if (!data.perClassData.containsKey(annotatedFullyQualifiedClassName)) {
563+
data.perClassData.put(annotatedFullyQualifiedClassName, new PerClassData());
564+
}
565+
PerClassData classData = data.perClassData.get(annotatedFullyQualifiedClassName);
566+
if (!classData.perMethodAnnotations.containsKey(methodName)) {
567+
classData.perMethodAnnotations.put(methodName, new TreeSet<>());
568+
}
569+
classData.perMethodAnnotations.get(methodName).add(annotationFullyQualifiedClassName);
589570
}
590-
classData.perMethodAnnotations.get(methodName).add(annotationFullyQualifiedClassName);
591-
}
592571

593-
private void noteAnnotatedField(
594-
String annotatedFullyQualifiedClassName,
595-
String fieldName,
596-
String annotationFullyQualifiedClassName) {
597-
if (!data.perClassData.containsKey(annotatedFullyQualifiedClassName)) {
598-
data.perClassData.put(annotatedFullyQualifiedClassName, new PerClassData());
599-
}
600-
PerClassData classData = data.perClassData.get(annotatedFullyQualifiedClassName);
601-
if (!classData.perFieldAnnotations.containsKey(fieldName)) {
602-
classData.perFieldAnnotations.put(fieldName, new TreeSet<>());
572+
private void noteAnnotatedField(
573+
String annotatedFullyQualifiedClassName,
574+
String fieldName,
575+
String annotationFullyQualifiedClassName) {
576+
if (!data.perClassData.containsKey(annotatedFullyQualifiedClassName)) {
577+
data.perClassData.put(annotatedFullyQualifiedClassName, new PerClassData());
578+
}
579+
PerClassData classData = data.perClassData.get(annotatedFullyQualifiedClassName);
580+
if (!classData.perFieldAnnotations.containsKey(fieldName)) {
581+
classData.perFieldAnnotations.put(fieldName, new TreeSet<>());
582+
}
583+
classData.perFieldAnnotations.get(fieldName).add(annotationFullyQualifiedClassName);
603584
}
604-
classData.perFieldAnnotations.get(fieldName).add(annotationFullyQualifiedClassName);
605585
}
606586
}

java/src/com/github/bazel_contrib/contrib_rules_jvm/javaparser/generators/GrpcServer.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -143,12 +143,10 @@ private Package getImports(ParsePackageRequest request) {
143143
}
144144
}
145145

146-
ClasspathParser parser = new ClasspathParser();
147-
148146
if (!javaFiles.isEmpty()) {
149147
try {
150-
parser.parseClasses(directory, javaFiles);
151-
ParsedPackageData javaData = parser.getParsedPackageData();
148+
ClasspathParser parser = new ClasspathParser();
149+
ParsedPackageData javaData = parser.parseClasses(directory, javaFiles);
152150
data.merge(javaData);
153151
} catch (IOException exception) {
154152
// If we fail to process a directory, which can happen with the module level processing

0 commit comments

Comments
 (0)