From 333d176f3fb8ff17e830a6de3c5c53dd7a2bd0f6 Mon Sep 17 00:00:00 2001 From: Ricardo Costa Date: Fri, 7 Aug 2026 00:29:35 +0100 Subject: [PATCH 1/2] Fix Field Initialization --- .../StateFieldInitializer.java | 23 +++++++++++++++++++ .../RefinementTypeChecker.java | 5 ++++ 2 files changed, 28 insertions(+) create mode 100644 liquidjava-example/src/main/java/testSuite/classes/state_field_initializer_correct/StateFieldInitializer.java diff --git a/liquidjava-example/src/main/java/testSuite/classes/state_field_initializer_correct/StateFieldInitializer.java b/liquidjava-example/src/main/java/testSuite/classes/state_field_initializer_correct/StateFieldInitializer.java new file mode 100644 index 00000000..ae3c3f51 --- /dev/null +++ b/liquidjava-example/src/main/java/testSuite/classes/state_field_initializer_correct/StateFieldInitializer.java @@ -0,0 +1,23 @@ +package testSuite.classes.state_field_initializer_correct; + +import liquidjava.specification.Ghost; +import liquidjava.specification.StateRefinement; + +public class StateFieldInitializer { + + private final Obj obj = new Obj(); + + public void test() { + obj.foo(); + } +} + +@Ghost("boolean ready") +class Obj { + + @StateRefinement(to="ready(this)") + Obj() {} + + @StateRefinement(from="ready(this)") + void foo() {} +} diff --git a/liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/RefinementTypeChecker.java b/liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/RefinementTypeChecker.java index 84d90a89..d36029b1 100644 --- a/liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/RefinementTypeChecker.java +++ b/liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/RefinementTypeChecker.java @@ -266,6 +266,11 @@ public void visitCtField(CtField f) { ret = c.get().substituteVariable(Keys.WILDCARD, name).substituteVariable(f.getSimpleName(), name); } RefinedVariable v = context.addVarToContext(name, f.getType(), ret, f); + if (f.getAssignment() != null) { + Predicate refinement = getRefinement(f.getAssignment()); + checkVariableRefinements(refinement != null ? refinement : new Predicate(), name, f.getType(), f, f); + AuxStateHandler.addStateRefinements(this, name, f.getAssignment()); + } getMessageFromAnnotation(f).ifPresent(v::setMessage); if (v instanceof Variable) { ((Variable) v).setLocation("this"); From 74dfda1852f83ef575eca83d66329d7a050955ec Mon Sep 17 00:00:00 2001 From: Ricardo Costa Date: Tue, 11 Aug 2026 10:39:29 +0100 Subject: [PATCH 2/2] Fix Instance Variables --- .../main/java/liquidjava/processor/context/Context.java | 8 ++++++++ .../refinement_checker/RefinementTypeChecker.java | 2 ++ 2 files changed, 10 insertions(+) diff --git a/liquidjava-verifier/src/main/java/liquidjava/processor/context/Context.java b/liquidjava-verifier/src/main/java/liquidjava/processor/context/Context.java index ddb55cf3..660a92d9 100644 --- a/liquidjava-verifier/src/main/java/liquidjava/processor/context/Context.java +++ b/liquidjava-verifier/src/main/java/liquidjava/processor/context/Context.java @@ -47,6 +47,14 @@ public void clearInstanceVariables() { ctxInstanceVars = new ArrayList<>(); } + public void restoreInstanceVariables() { + for (RefinedVariable variable : getCtxVars()) { + if (variable instanceof Variable) { + ((Variable) variable).getLastInstance().ifPresent(this::addInstanceVariable); + } + } + } + public void reinitializeAllContext() { reinitializeContext(); ctxFunctions = new ArrayList<>(); diff --git a/liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/RefinementTypeChecker.java b/liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/RefinementTypeChecker.java index d36029b1..bf6dcc99 100644 --- a/liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/RefinementTypeChecker.java +++ b/liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/RefinementTypeChecker.java @@ -107,6 +107,7 @@ public void visitCtAnnotationType(CtAnnotationType ann public void visitCtConstructor(CtConstructor constructor) { context.clearInstanceVariables(); context.enterContext(); + context.restoreInstanceVariables(); mfc.loadFunctionInfo(constructor); try { super.visitCtConstructor(constructor); @@ -121,6 +122,7 @@ public void visitCtConstructor(CtConstructor constructor) { public void visitCtMethod(CtMethod method) { context.clearInstanceVariables(); context.enterContext(); + context.restoreInstanceVariables(); if (!method.getSignature().equals("main(java.lang.String[])")) { mfc.loadFunctionInfo(method); }