diff --git a/liquidjava-example/src/main/java/testSuite/classes/inherited_constant_correct/ImageWriteParamRefinements.java b/liquidjava-example/src/main/java/testSuite/classes/inherited_constant_correct/ImageWriteParamRefinements.java new file mode 100644 index 00000000..a4abd66f --- /dev/null +++ b/liquidjava-example/src/main/java/testSuite/classes/inherited_constant_correct/ImageWriteParamRefinements.java @@ -0,0 +1,16 @@ +package testSuite.classes.inherited_constant_correct; + +import liquidjava.specification.ExternalRefinementsFor; +import liquidjava.specification.Refinement; +import liquidjava.specification.StateRefinement; +import liquidjava.specification.StateSet; + +@StateSet({"start", "explicit"}) +@ExternalRefinementsFor("javax.imageio.ImageWriteParam") +public interface ImageWriteParamRefinements { + @StateRefinement(to = "mode == 2 ? explicit(this) : start(this)") + void setCompressionMode(@Refinement("_ >= 0 && _ <= 3") int mode); + + @StateRefinement(from = "explicit(this)") + void setCompressionQuality(@Refinement("_ >= 0.0 && _ <= 1.0") float quality); +} diff --git a/liquidjava-example/src/main/java/testSuite/classes/inherited_constant_correct/SimpleTest.java b/liquidjava-example/src/main/java/testSuite/classes/inherited_constant_correct/SimpleTest.java new file mode 100644 index 00000000..02a6e512 --- /dev/null +++ b/liquidjava-example/src/main/java/testSuite/classes/inherited_constant_correct/SimpleTest.java @@ -0,0 +1,14 @@ +package testSuite.classes.inherited_constant_correct; + +import javax.imageio.ImageIO; +import javax.imageio.ImageWriteParam; +import javax.imageio.plugins.jpeg.JPEGImageWriteParam; + +public class SimpleTest { + + public static void main(String[] args) { + ImageWriteParam param = ImageIO.getImageWritersByFormatName("jpeg").next().getDefaultWriteParam(); + param.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT); + param.setCompressionQuality(0.5f); + } +} diff --git a/liquidjava-verifier/src/main/java/liquidjava/utils/StaticConstants.java b/liquidjava-verifier/src/main/java/liquidjava/utils/StaticConstants.java index 0e8657b5..4bcbd99e 100644 --- a/liquidjava-verifier/src/main/java/liquidjava/utils/StaticConstants.java +++ b/liquidjava-verifier/src/main/java/liquidjava/utils/StaticConstants.java @@ -30,8 +30,8 @@ private StaticConstants() { * *
* Tries the source AST first ({@link CtLiteral} initializer in Spoon's model), then reflection via - * {@link CtFieldReference#getActualField()} + {@link #readStaticFinal}. Returns {@code null} if the field isn't - * static-final, has a non-literal initializer, or any lookup step fails. + * {@link Class#getField(String)} + {@link #readStaticFinal} so inherited public constants are included. Returns + * {@code null} if the field isn't static-final, has a non-literal initializer, or any lookup step fails. * * @see #resolve(String, String, CtElement) sibling for refinement-string {@code Type.CONST} references */ @@ -43,8 +43,8 @@ public static Object resolve(CtFieldReference> ref) { if (v != null) return v; try { - return ref.getActualField()instanceof Field jf ? readStaticFinal(jf) : null; - } catch (RuntimeException | LinkageError ignored) { + return readStaticFinal(ref.getDeclaringType().getActualClass().getField(ref.getSimpleName())); + } catch (NoSuchFieldException | RuntimeException | LinkageError ignored) { // Spoon throws SpoonClassNotFoundException; reflection can throw LinkageError. Fall through. return null; }