Skip to content

Commit b6c5eb1

Browse files
committed
add matcher
1 parent dd7a4a2 commit b6c5eb1

5 files changed

Lines changed: 95 additions & 3 deletions

File tree

key.ncore.java/src/adt/java-ast.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
import de.uka.ilkd.key.speclang.jml.pretranslation.*;
44
import de.uka.ilkd.key.java.ast.PositionInfo;
55
import org.key_project.util.collection.*;
6+
import de.uka.ilkd.key.rule.MatchConditions;
7+
68

79
@Root
8-
abstract class JavaSourceElement implements Visitable {
10+
abstract class JavaSourceElement implements Visitable, Matchable {
911
@EqEx @Nullable PositionInfo positionInfo;
1012
}
1113

key.ncore.java/src/generator/java/org/key_project/ncore/java/Generator.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,12 @@ public Generator() {
5353
addStep(NodeSteps::addEquals);
5454
addStep(NodeSteps::ToString);
5555
addStep(NodeSteps::addHashCode);
56+
addStep(NodeSteps::addMatch);
5657
addStep(NodeSteps::addWiths);
5758
addStep(NodeSteps::addBuilder);
5859
addStep(NodeSteps::addOverrideConstructor);
5960
addStep(NodeSteps::addOverrideConstructor2);
60-
addStep(NodeSteps::addGetProperties);
61+
//addStep(NodeSteps::addGetProperties);
6162
addStep(NodeSteps::processFieldsAccessor);
6263

6364
postSteps.add(PostSteps::createVisitor);

key.ncore.java/src/generator/java/org/key_project/ncore/java/NodeSteps.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,34 @@ private static String upperStart(String nameAsString) {
6060
return c + nameAsString.substring(1);
6161
}
6262

63+
static void addMatch(ClassOrInterfaceDeclaration target) {
64+
if (target.isAbstract() || target.isInterface()) {
65+
return;
66+
}
67+
MethodDeclaration equals = target.addMethod("match", PUBLIC);
68+
equals.addModifier(FINAL);
69+
equals.addAnnotation(Override.class);
70+
equals.addAnnotation(Nullable.class);
71+
equals.setType("MatchConditions");
72+
final var o = getNullableObject();
73+
equals.getParameters().add(o);
74+
equals.addParameter("MatchConditions", "cond");
75+
76+
BlockStmt body = equals.getBody().get();
77+
body.addStatement(parseStatement(
78+
"if(!(o instanceof %s other)) return null;".formatted(target.getNameAsString())));
79+
var fields = target.getFields().stream()
80+
.filter(it -> it.getAnnotationByName("EqEx").isEmpty())
81+
.flatMap(it -> it.getVariables().stream())
82+
.toList();
83+
for (var field : fields) {
84+
body.addStatement("cond = MatchHelper.match(%s, other.%s, cond);"
85+
.formatted(field.getNameAsString(), field.getNameAsString()));
86+
body.addStatement("if(cond==null) {return null;}");
87+
}
88+
body.addStatement("return cond;");
89+
}
90+
6391
static void addEquals(ClassOrInterfaceDeclaration target) {
6492
if (target.isAbstract() || target.isInterface()) {
6593
return;
@@ -208,7 +236,6 @@ static void addAllWoOptFieldsConstructor(ClassOrInterfaceDeclaration target) {
208236
target.addMember(constr);
209237
}
210238

211-
212239
static void addOverrideConstructor(ClassOrInterfaceDeclaration target) {
213240
if (target.isInterface()) {
214241
return;
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package org.key_project.java.ast;
2+
3+
import de.uka.ilkd.key.rule.MatchConditions;
4+
import org.jspecify.annotations.Nullable;
5+
import org.key_project.util.collection.RoList;
6+
7+
import java.util.Objects;
8+
9+
/**
10+
*
11+
* @author Alexander Weigl
12+
* @version 1 (25.04.26)
13+
*/
14+
public class MatchHelper {
15+
public static @Nullable MatchConditions match(Enum<?> e1, Enum<?> e2, MatchConditions cond) {
16+
return Objects.equals(e1, e2) ? cond : null;
17+
}
18+
19+
public static @Nullable MatchConditions match(int i1, int i2, MatchConditions cond) {
20+
return i1 == i2 ? cond : null;
21+
}
22+
23+
public static @Nullable MatchConditions match(long i1, long i2, MatchConditions cond) {
24+
return i1 == i2 ? cond : null;
25+
}
26+
27+
public static @Nullable MatchConditions match(String s1, String s2, MatchConditions cond) {
28+
return Objects.equals(s1, s2) ? cond : null;
29+
}
30+
31+
public static @Nullable <T extends Matchable> MatchConditions match(RoList<T> seq1, RoList<T> seq2, MatchConditions cond) {
32+
if (seq1.size() != seq2.size()) {
33+
return null;
34+
}
35+
for (int i = 0; i < seq1.size(); i++) {
36+
var e1 = seq1.get(i);
37+
var e2 = seq2.get(i);
38+
cond = e1.match(e2, cond);
39+
if (cond == null) {
40+
return null;
41+
}
42+
}
43+
return cond;
44+
}
45+
46+
public static @Nullable MatchConditions match(JavaSourceElement e1, JavaSourceElement e2, MatchConditions cond) {
47+
return e1.match(e2, cond);
48+
}
49+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.key_project.java.ast;
2+
3+
import de.uka.ilkd.key.rule.MatchConditions;
4+
import org.jspecify.annotations.Nullable;
5+
6+
/**
7+
*
8+
* @author Alexander Weigl
9+
* @version 1 (25.04.26)
10+
*/
11+
public interface Matchable {
12+
@Nullable MatchConditions match(Object o, MatchConditions cond);
13+
}

0 commit comments

Comments
 (0)