diff --git a/liquidjava-verifier/src/main/java/liquidjava/api/CommandLineLauncher.java b/liquidjava-verifier/src/main/java/liquidjava/api/CommandLineLauncher.java index 6a066f7b..e7efeff6 100644 --- a/liquidjava-verifier/src/main/java/liquidjava/api/CommandLineLauncher.java +++ b/liquidjava-verifier/src/main/java/liquidjava/api/CommandLineLauncher.java @@ -6,6 +6,7 @@ import liquidjava.diagnostics.Diagnostics; import liquidjava.diagnostics.errors.CustomError; +import liquidjava.diagnostics.warnings.CustomWarning; import liquidjava.processor.RefinementProcessor; import spoon.Launcher; import spoon.processing.ProcessingManager; @@ -54,7 +55,11 @@ public static void launch(String... paths) { } launcher.getEnvironment().setNoClasspath(true); launcher.getEnvironment().setComplianceLevel(8); - launcher.run(); + + boolean buildSuccess = launcher.getModelBuilder().build(); + if (!buildSuccess) { + diagnostics.add(new CustomWarning("Java compilation error detected. Verification might be affected.")); + } final Factory factory = launcher.getFactory(); final ProcessingManager processingManager = new QueueProcessingManager(factory); diff --git a/liquidjava-verifier/src/main/java/liquidjava/diagnostics/warnings/CustomWarning.java b/liquidjava-verifier/src/main/java/liquidjava/diagnostics/warnings/CustomWarning.java new file mode 100644 index 00000000..22e5917d --- /dev/null +++ b/liquidjava-verifier/src/main/java/liquidjava/diagnostics/warnings/CustomWarning.java @@ -0,0 +1,20 @@ +package liquidjava.diagnostics.warnings; + +import spoon.reflect.cu.SourcePosition; + +/** + * Custom warning with a message + * + * @see LJWarning + */ +public class CustomWarning extends LJWarning { + + public CustomWarning(SourcePosition position, String message) { + super(message, position); + } + + public CustomWarning(String message) { + super(message, null); + } + +} diff --git a/liquidjava-verifier/src/main/java/liquidjava/diagnostics/warnings/ExternalClassNotFoundWarning.java b/liquidjava-verifier/src/main/java/liquidjava/diagnostics/warnings/ExternalClassNotFoundWarning.java index 86438b6b..356542f0 100644 --- a/liquidjava-verifier/src/main/java/liquidjava/diagnostics/warnings/ExternalClassNotFoundWarning.java +++ b/liquidjava-verifier/src/main/java/liquidjava/diagnostics/warnings/ExternalClassNotFoundWarning.java @@ -1,6 +1,6 @@ package liquidjava.diagnostics.warnings; -import spoon.reflect.declaration.CtElement; +import spoon.reflect.cu.SourcePosition; /** * Warning indicating that a class referenced in an external refinement was not found @@ -11,8 +11,8 @@ public class ExternalClassNotFoundWarning extends LJWarning { private final String className; - public ExternalClassNotFoundWarning(CtElement element, String message, String className) { - super(message, element.getPosition()); + public ExternalClassNotFoundWarning(SourcePosition position, String message, String className) { + super(message, position); this.className = className; } diff --git a/liquidjava-verifier/src/main/java/liquidjava/diagnostics/warnings/ExternalMethodNotFoundWarning.java b/liquidjava-verifier/src/main/java/liquidjava/diagnostics/warnings/ExternalMethodNotFoundWarning.java index 60f20f17..c9f573ae 100644 --- a/liquidjava-verifier/src/main/java/liquidjava/diagnostics/warnings/ExternalMethodNotFoundWarning.java +++ b/liquidjava-verifier/src/main/java/liquidjava/diagnostics/warnings/ExternalMethodNotFoundWarning.java @@ -1,6 +1,6 @@ package liquidjava.diagnostics.warnings; -import spoon.reflect.declaration.CtElement; +import spoon.reflect.cu.SourcePosition; /** * Warning indicating that a method referenced in an external refinement was not found @@ -13,9 +13,9 @@ public class ExternalMethodNotFoundWarning extends LJWarning { private final String className; private final String[] overloads; - public ExternalMethodNotFoundWarning(CtElement element, String message, String methodName, String className, + public ExternalMethodNotFoundWarning(SourcePosition position, String message, String methodName, String className, String[] overloads) { - super(message, element.getPosition()); + super(message, position); this.methodName = methodName; this.className = className; this.overloads = overloads; diff --git a/liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/ExternalRefinementTypeChecker.java b/liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/ExternalRefinementTypeChecker.java index a52ac891..7bd910b6 100644 --- a/liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/ExternalRefinementTypeChecker.java +++ b/liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/ExternalRefinementTypeChecker.java @@ -43,7 +43,7 @@ public void visitCtInterface(CtInterface intrface) { this.prefix = externalRefinements.get(); if (!classExists(prefix)) { String message = String.format("Could not find class '%s'", prefix); - diagnostics.add(new ExternalClassNotFoundWarning(intrface, message, prefix)); + diagnostics.add(new ExternalClassNotFoundWarning(intrface.getPosition(), message, prefix)); return; } getRefinementFromAnnotation(intrface); @@ -72,7 +72,7 @@ public void visitCtMethod(CtMethod method) { prefix); String[] overloads = getOverloads(targetType, method); diagnostics.add( - new ExternalMethodNotFoundWarning(method, message, method.getSignature(), prefix, overloads)); + new ExternalMethodNotFoundWarning(method.getPosition(), message, method.getSignature(), prefix, overloads)); } } else { if (!methodExists(targetType, method)) { @@ -80,7 +80,7 @@ public void visitCtMethod(CtMethod method) { method.getType().getSimpleName(), method.getSignature(), prefix); String[] overloads = getOverloads(targetType, method); diagnostics.add( - new ExternalMethodNotFoundWarning(method, message, method.getSignature(), prefix, overloads)); + new ExternalMethodNotFoundWarning(method.getPosition(), message, method.getSignature(), prefix, overloads)); return; } }