Skip to content
Prev Previous commit
Remove Fields Implicit Null Refinement
  • Loading branch information
rcosta358 committed Feb 15, 2026
commit c739e5f096fb4f3ae185dd2af2d0ba9c85d26f16

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// Refinement Error
package testSuite;

import liquidjava.specification.Refinement;

public class ErrorNullableFieldNonNullAssumption {
Integer x;

void test() {
mustBeNonNull(x); // we dont know if x is null or not
}

void mustBeNonNull(@Refinement("_ != null") Integer i) {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// Refinement Error
package testSuite;

import liquidjava.specification.Refinement;

public class ErrorNullableFieldNullAssumption {
Integer x;

void test() {
mustBeNull(x); // we dont know if x is null or not
}

void mustBeNull(@Refinement("_ == null") Integer i) {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -246,14 +246,6 @@ public <T> void visitCtField(CtField<T> f) {
if (v instanceof Variable) {
((Variable) v).setLocation("this");
}
// if the field is not initialized and can be null, add instance to context with null equality refinement
if (f.getAssignment() == null && !Utils.isPrimitiveType(f.getType().getQualifiedName())) {
String instanceName = String.format(Formats.INSTANCE, name, context.getCounter());
Predicate initialRefinement = Predicate.createConjunction(ret.substituteVariable(name, instanceName),
Predicate.createNullEq().substituteVariable(Keys.WILDCARD, instanceName));
context.addInstanceToContext(instanceName, f.getType(), initialRefinement, f);
context.addRefinementInstanceToVariable(name, instanceName);
}
}

@Override
Expand All @@ -270,13 +262,9 @@ public <T> void visitCtFieldRead(CtFieldRead<T> fieldRead) {
}

} else if (context.hasVariable(String.format(Formats.THIS, fieldName))) {
// resolve to latest instance of this field for flow-sensitive refinement
String thisName = String.format(Formats.THIS, fieldName);
Optional<VariableInstance> ovi = context.getLastVariableInstance(thisName);
String var = ovi.isPresent() ? ovi.get().getName() : thisName;
fieldRead.putMetadata(Keys.REFINEMENT,
Predicate.createEquals(Predicate.createVar(Keys.WILDCARD), Predicate.createVar(var)));

Predicate.createEquals(Predicate.createVar(Keys.WILDCARD), Predicate.createVar(thisName)));
} else if (fieldRead.getVariable().getSimpleName().equals("length")) {
String targetName = fieldRead.getTarget().toString();
fieldRead.putMetadata(Keys.REFINEMENT, Predicate.createEquals(Predicate.createVar(Keys.WILDCARD),
Expand Down