Skip to content

Commit b2254c8

Browse files
committed
Find Annotation by Value
1 parent d60aadc commit b2254c8

File tree

3 files changed

+18
-5
lines changed

3 files changed

+18
-5
lines changed

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
@@ -235,7 +235,7 @@ protected void handleAlias(String ref, CtElement element) throws LJError {
235235
}
236236
} catch (LJError e) {
237237
// add location info to error
238-
SourcePosition pos = Utils.getAnnotationPosition(element);
238+
SourcePosition pos = Utils.getAnnotationPosition(element, ref);
239239
e.setPosition(pos);
240240
throw e;
241241
}

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.getAnnotationPosition(element);
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: 16 additions & 3 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,9 +38,19 @@ public static String qualifyName(String prefix, String name) {
3538
return String.format("%s.%s", prefix, name);
3639
}
3740

38-
public static SourcePosition getAnnotationPosition(CtElement element) {
41+
public static SourcePosition getAnnotationPosition(CtElement element, String refinement) {
3942
return element.getAnnotations().stream()
40-
.filter(a -> a.getAnnotationType().getQualifiedName().startsWith("liquidjava.specification"))
41-
.findFirst().map(CtElement::getPosition).orElse(element.getPosition());
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))));
4255
}
4356
}

0 commit comments

Comments
 (0)