Skip to content

Commit 69a0541

Browse files
authored
Preserve refinement on forward declared field reads (#325)
Closes #316. Reads of fields in later declared classes now use the field's refinement when it is not yet in context. Adds a regression example. Tests: `./mvnw -pl liquidjava-verifier -am -Dtest=TestExamples -Dsurefire.failIfNoSpecifiedTests=false test` (197 passed). This PR was generated by Codex.
1 parent d620726 commit 69a0541

2 files changed

Lines changed: 21 additions & 0 deletions

File tree

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package testSuite.classes.forward_field_read_correct;
2+
3+
import liquidjava.specification.Refinement;
4+
5+
public class ReadBefore {
6+
private final Job job = new Job();
7+
8+
@Refinement("_ >= 0")
9+
public int get() {
10+
return job.port;
11+
}
12+
13+
static class Job {
14+
@Refinement("_ >= 0")
15+
int port;
16+
}
17+
}

‎liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/RefinementTypeChecker.java‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,10 @@ public <T> void visitCtFieldRead(CtFieldRead<T> fieldRead) {
321321
Predicate.createEquals(Predicate.createVar(Keys.WILDCARD), Predicate.createVar(enumLiteral)));
322322
} else if (tryStaticFinalConstantRefinement(fieldRead)) {
323323
// refinement metadata set by helper
324+
} else if (fieldRead.getVariable().getDeclaration() != null) {
325+
Predicate declared = getRefinementFromAnnotation(fieldRead.getVariable().getDeclaration())
326+
.orElseGet(Predicate::new);
327+
fieldRead.putMetadata(Keys.REFINEMENT, declared.substituteVariable(fieldName, Keys.WILDCARD));
324328
} else {
325329
fieldRead.putMetadata(Keys.REFINEMENT, new Predicate());
326330
// TODO DO WE WANT THIS OR TO SHOW ERROR MESSAGE?

0 commit comments

Comments
 (0)