Skip to content

Commit 6a713e2

Browse files
committed
Use Annotation Position in Syntax Errors
1 parent e64d5b7 commit 6a713e2

4 files changed

Lines changed: 23 additions & 5 deletions

File tree

liquidjava-verifier/src/main/java/liquidjava/diagnostics/errors/SyntaxError.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package liquidjava.diagnostics.errors;
22

3-
import spoon.reflect.declaration.CtElement;
3+
import spoon.reflect.cu.SourcePosition;
44

55
/**
66
* Error indicating that the syntax of a refinement is invalid
@@ -11,12 +11,13 @@ public class SyntaxError extends LJError {
1111

1212
private String refinement;
1313

14+
1415
public SyntaxError(String message, String refinement) {
1516
this(message, null, refinement);
1617
}
1718

18-
public SyntaxError(String message, CtElement element, String refinement) {
19-
super("Syntax Error", message, "", element.getPosition(), null);
19+
public SyntaxError(String message, SourcePosition pos, String refinement) {
20+
super("Syntax Error", message, "", pos, null);
2021
this.refinement = refinement;
2122
}
2223

liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/TypeChecker.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import liquidjava.rj_language.Predicate;
2121
import liquidjava.rj_language.parsing.ParsingException;
2222
import liquidjava.rj_language.parsing.RefinementsParser;
23+
import liquidjava.utils.Utils;
2324
import liquidjava.utils.constants.Formats;
2425
import liquidjava.utils.constants.Keys;
2526
import liquidjava.utils.constants.Types;
@@ -254,7 +255,8 @@ protected void handleAlias(String value, CtElement element) {
254255
context.addAlias(aw);
255256
}
256257
} catch (ParsingException e) {
257-
diagnostics.add(new SyntaxError(e.getMessage(), element, value));
258+
SourcePosition pos = Utils.getRefinementAnnotationPosition(element, value);
259+
diagnostics.add(new SyntaxError(e.getMessage(), pos, value));
258260
}
259261
}
260262

liquidjava-verifier/src/main/java/liquidjava/rj_language/Predicate.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import liquidjava.utils.constants.Keys;
3232
import liquidjava.utils.constants.Ops;
3333
import liquidjava.utils.constants.Types;
34+
import spoon.reflect.cu.SourcePosition;
3435
import spoon.reflect.declaration.CtElement;
3536
import spoon.reflect.declaration.CtType;
3637
import spoon.reflect.factory.Factory;
@@ -90,7 +91,8 @@ protected Expression parse(String ref, CtElement element) throws ParsingExceptio
9091
try {
9192
return RefinementsParser.createAST(ref, prefix);
9293
} catch (ParsingException e) {
93-
diagnostics.add(new SyntaxError(e.getMessage(), element, ref));
94+
SourcePosition pos = Utils.getRefinementAnnotationPosition(element, ref);
95+
diagnostics.add(new SyntaxError(e.getMessage(), pos, ref));
9496
throw e;
9597
}
9698
}

liquidjava-verifier/src/main/java/liquidjava/utils/Utils.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import java.util.Set;
44

55
import liquidjava.utils.constants.Types;
6+
import spoon.reflect.cu.SourcePosition;
7+
import spoon.reflect.declaration.CtElement;
68
import spoon.reflect.factory.Factory;
79
import spoon.reflect.reference.CtTypeReference;
810

@@ -36,4 +38,15 @@ public static String qualifyName(String prefix, String name) {
3638
public static String stripParens(String s) {
3739
return s.startsWith("(") && s.endsWith(")") ? s.substring(1, s.length() - 1) : s;
3840
}
41+
42+
public static SourcePosition getRefinementAnnotationPosition(CtElement element, String refinement) {
43+
return element.getAnnotations().stream()
44+
.filter(a -> {
45+
String value = a.getValue("value").toString();
46+
String unquoted = value.substring(1, value.length() - 1);
47+
return unquoted.equals(refinement);
48+
}).findFirst()
49+
.map(a -> a.getPosition())
50+
.orElse(element.getPosition());
51+
}
3952
}

0 commit comments

Comments
 (0)