Skip to content

Commit adfed42

Browse files
Include subpackage checking (#156)
1 parent 9eb34e5 commit adfed42

File tree

2 files changed

+32
-25
lines changed

2 files changed

+32
-25
lines changed

liquidjava-verifier/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
<groupId>io.github.liquid-java</groupId>
1313
<artifactId>liquidjava-verifier</artifactId>
14-
<version>0.0.12</version>
14+
<version>0.0.13</version>
1515
<name>liquidjava-verifier</name>
1616
<description>LiquidJava Verifier</description>
1717
<url>https://github.com/liquid-java/liquidjava</url>
Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
package liquidjava.processor;
22

3-
import java.util.ArrayList;
4-
import java.util.List;
5-
63
import liquidjava.diagnostics.Diagnostics;
74
import liquidjava.diagnostics.errors.LJError;
85
import liquidjava.processor.ann_generation.FieldGhostsGeneration;
@@ -17,37 +14,47 @@
1714
/** Finds circular dependencies between packages */
1815
public class RefinementProcessor extends AbstractProcessor<CtPackage> {
1916

20-
List<CtPackage> visitedPackages = new ArrayList<>();
2117
Factory factory;
2218
Diagnostics diagnostics = Diagnostics.getInstance();
2319

2420
public RefinementProcessor(Factory factory) {
2521
this.factory = factory;
2622
}
2723

24+
@Override
25+
public boolean isToBeProcessed(CtPackage pkg) {
26+
// Only let Spoon invoke us for the root package;
27+
// we handle sub-packages ourselves to guarantee parent-before-child order.
28+
return pkg.isUnnamedPackage();
29+
}
30+
2831
@Override
2932
public void process(CtPackage pkg) {
30-
if (!visitedPackages.contains(pkg)) {
31-
visitedPackages.add(pkg);
32-
Context c = Context.getInstance();
33-
c.reinitializeAllContext();
34-
35-
try {
36-
// process types in this package only, not sub-packages
37-
// first pass: gather refinements
38-
pkg.getTypes().forEach(type -> {
39-
type.accept(new FieldGhostsGeneration(c, factory)); // generate annotations for field ghosts
40-
type.accept(new ExternalRefinementTypeChecker(c, factory)); // process external refinements
41-
type.accept(new MethodsFirstChecker(c, factory)); // double passing idea (instead of headers)
42-
});
43-
44-
// second pass: check refinements
45-
pkg.getTypes().forEach(type -> {
46-
type.accept(new RefinementTypeChecker(c, factory));
47-
});
48-
} catch (LJError e) {
49-
diagnostics.add(e);
33+
Context c = Context.getInstance();
34+
c.reinitializeAllContext();
35+
processPackage(pkg, c);
36+
}
37+
38+
private void processPackage(CtPackage pkg, Context c) {
39+
try {
40+
// first pass: gather refinements
41+
pkg.getTypes().forEach(type -> {
42+
type.accept(new FieldGhostsGeneration(c, factory));
43+
type.accept(new ExternalRefinementTypeChecker(c, factory));
44+
type.accept(new MethodsFirstChecker(c, factory));
45+
});
46+
47+
// second pass: check refinements
48+
pkg.getTypes().forEach(type -> {
49+
type.accept(new RefinementTypeChecker(c, factory));
50+
});
51+
52+
// recurse into sub-packages (inheriting context)
53+
for (CtPackage subPkg : pkg.getPackages()) {
54+
processPackage(subPkg, c);
5055
}
56+
} catch (LJError e) {
57+
diagnostics.add(e);
5158
}
5259
}
5360
}

0 commit comments

Comments
 (0)