Skip to content

Commit e7933ea

Browse files
authored
Fix Annotation Position Lookup (#141)
1 parent f3e86b3 commit e7933ea

File tree

5 files changed

+30
-9
lines changed

5 files changed

+30
-9
lines changed

liquidjava-example/src/main/java/testSuite/ErrorSyntax1.java renamed to liquidjava-example/src/main/java/testSuite/ErrorSyntaxRefinement.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import liquidjava.specification.Refinement;
55

66
@SuppressWarnings("unused")
7-
public class ErrorSyntax1 {
7+
public class ErrorSyntaxRefinement {
88
public static void main(String[] args) {
99
@Refinement("_ < 100 +")
1010
int value = 90 + 4;
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// Syntax Error
2+
package testSuite;
3+
4+
import liquidjava.specification.StateRefinement;
5+
6+
public class ErrorSyntaxStateRefinement {
7+
8+
@StateRefinement(from="$", to="#")
9+
void test() {}
10+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ protected void handleAlias(String ref, CtElement element) throws LJError {
251251
}
252252
} catch (LJError e) {
253253
// add location info to error
254-
SourcePosition pos = Utils.getRefinementAnnotationPosition(element, ref);
254+
SourcePosition pos = Utils.getAnnotationPosition(element, ref);
255255
e.setPosition(pos);
256256
throw e;
257257
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ protected Expression parse(String ref, CtElement element) throws LJError {
8787
return RefinementsParser.createAST(ref, prefix);
8888
} catch (LJError e) {
8989
// add location info to error
90-
SourcePosition pos = Utils.getRefinementAnnotationPosition(element, ref);
90+
SourcePosition pos = Utils.getAnnotationPosition(element, ref);
9191
e.setPosition(pos);
9292
throw e;
9393
}

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

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package liquidjava.utils;
22

3+
import java.util.Map;
34
import java.util.Set;
5+
import java.util.stream.Stream;
46

57
import liquidjava.utils.constants.Types;
68
import spoon.reflect.cu.SourcePosition;
9+
import spoon.reflect.declaration.CtAnnotation;
710
import spoon.reflect.declaration.CtElement;
811
import spoon.reflect.factory.Factory;
912
import spoon.reflect.reference.CtTypeReference;
@@ -35,11 +38,19 @@ public static String qualifyName(String prefix, String name) {
3538
return String.format("%s.%s", prefix, name);
3639
}
3740

38-
public static SourcePosition getRefinementAnnotationPosition(CtElement element, String refinement) {
39-
return element.getAnnotations().stream().filter(a -> {
40-
String value = a.getValue("value").toString();
41-
String unquoted = value.substring(1, value.length() - 1);
42-
return unquoted.equals(refinement);
43-
}).findFirst().map(CtElement::getPosition).orElse(element.getPosition());
41+
public static SourcePosition getAnnotationPosition(CtElement element, String refinement) {
42+
return element.getAnnotations().stream()
43+
.filter(a -> isLiquidJavaAnnotation(a) && hasRefinementValue(a, "\"" + refinement + "\"")).findFirst()
44+
.map(CtElement::getPosition).orElse(element.getPosition());
45+
}
46+
47+
private static boolean isLiquidJavaAnnotation(CtAnnotation<?> annotation) {
48+
return annotation.getAnnotationType().getQualifiedName().startsWith("liquidjava.specification");
49+
}
50+
51+
private static boolean hasRefinementValue(CtAnnotation<?> annotation, String refinement) {
52+
Map<String, ?> values = annotation.getValues();
53+
return Stream.of("value", "to", "from")
54+
.anyMatch(key -> refinement.equals(String.valueOf(values.get(key))));
4455
}
4556
}

0 commit comments

Comments
 (0)