Skip to content

Commit b02fcf5

Browse files
Add computation visitors
* Fix immutable fields * Fix .gitignore * Re-add Guava dependency
1 parent 0e3ff02 commit b02fcf5

30 files changed

+331
-72
lines changed

.gitignore

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
**/.kotlin
88

99
# Build dirs
10-
rsvp/build
11-
rsvp/bin
12-
rsvp/app/build
13-
rsvp/app/bin
14-
rsvp/policy-ast/build
15-
rsvp/policy-ast/bin
10+
/rsvp/build
11+
/rsvp/bin
12+
/rsvp/app/build
13+
/rsvp/app/bin
14+
/rsvp/policy-ast/build
15+
/rsvp/policy-ast/bin

rsvp/README.md

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,18 @@ Before building this project, you will need to build and deploy CedarJava locall
4949
5050
## Implement a new policy visitor
5151
52-
Visitor classes can be found in the `uq.pac.rsvp.policy.ast.visitor` package. Visitors that don't need to visit every node type but would still like to traverse the entire tree can extend the `PolicyVisitorImpl` class. Otherwise, interface `PolicyVisitor` can be implemented directly.
52+
Visitor classes can be found in the `uq.pac.rsvp.policy.ast.visitor` package.
5353
54-
The JSON schema for the serialised Java AST is defined in `lib/src/main/resources/ast.schema.json`. A schema for the Cedar JSON
55-
Schema syntax can be found in the [Cedar VSCode Extension repository](https://raw.githubusercontent.com/cedar-policy/vscode-cedar/refs/heads/main/schemas/cedarschema.schema.json).
54+
There are two types of visitors, visitors that return `void` from their visit methods, and visitors that return a
55+
generic typed value. Visitors that return void should implement `PolicyVisitor` or `SchemaVisitor`. If they don't
56+
need to visit every node type but would still like to traverse the entire tree, `PolicyVisitorImpl` or
57+
`SchemaVisitorImpl` can be extended instead.
58+
59+
Visitors that return a value from their `visit` methods should implement `PolicyComputationVisitor` or
60+
`SchemaComputationVisitor` and call the generic `compute` method on each `AST` node, rather than `visit`.
61+
62+
The JSON schema for the serialised Java AST is defined in `lib/src/main/resources/ast.schema.json`. A
63+
schema for the Cedar JSON schema syntax can be found in the [Cedar VSCode Extension repository](https://raw.githubusercontent.com/cedar-policy/vscode-cedar/refs/heads/main/schemas/cedarschema.schema.json).
5664
5765
## Using the policy AST library in another project
5866

rsvp/build.gradle

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,9 @@ allprojects {
1010
dependencies {
1111
// Custom cedar-java fork (https://github.com/rebecca-odonoghue/cedar-java)
1212
implementation 'com.cedarpolicy:cedar-java:3.1.2-rsvp:uber'
13-
1413
implementation 'com.google.code.gson:gson:2.13.2'
15-
1614
implementation 'com.fasterxml.jackson.core:jackson-databind:2.20.0'
15+
implementation libs.guava
1716

1817
// Use JUnit Jupiter for testing.
1918
testImplementation libs.junit.jupiter

rsvp/policy-ast/src/main/java/uq/pac/rsvp/policy/ast/Policy.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.google.gson.annotations.SerializedName;
44

55
import uq.pac.rsvp.policy.ast.expr.Expression;
6+
import uq.pac.rsvp.policy.ast.visitor.PolicyComputationVisitor;
67
import uq.pac.rsvp.policy.ast.visitor.PolicyVisitor;
78

89
public class Policy {
@@ -42,6 +43,10 @@ public void accept(PolicyVisitor visitor) {
4243
visitor.visitPolicy(this);
4344
}
4445

46+
public <T> T compute(PolicyComputationVisitor<T> visitor) {
47+
return visitor.visitPolicy(this);
48+
}
49+
4550
@Override
4651
public String toString() {
4752
StringBuilder sb = new StringBuilder();

rsvp/policy-ast/src/main/java/uq/pac/rsvp/policy/ast/expr/BinaryExpression.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.google.gson.annotations.SerializedName;
66

77
import uq.pac.rsvp.policy.ast.SourceLoc;
8+
import uq.pac.rsvp.policy.ast.visitor.PolicyComputationVisitor;
89
import uq.pac.rsvp.policy.ast.visitor.PolicyVisitor;
910

1011
public class BinaryExpression extends Expression {
@@ -84,6 +85,11 @@ public void accept(PolicyVisitor visitor) {
8485
visitor.visitBinaryExpr(this);
8586
}
8687

88+
@Override
89+
public <T> T compute(PolicyComputationVisitor<T> visitor) {
90+
return visitor.visitBinaryExpr(this);
91+
}
92+
8793
@Override
8894
public String toString() {
8995
StringBuilder sb = new StringBuilder();

rsvp/policy-ast/src/main/java/uq/pac/rsvp/policy/ast/expr/BooleanExpression.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static uq.pac.rsvp.policy.ast.expr.Expression.ExprType.BooleanLiteral;
44

55
import uq.pac.rsvp.policy.ast.SourceLoc;
6+
import uq.pac.rsvp.policy.ast.visitor.PolicyComputationVisitor;
67
import uq.pac.rsvp.policy.ast.visitor.PolicyVisitor;;
78

89
public class BooleanExpression extends Expression {
@@ -23,6 +24,11 @@ public void accept(PolicyVisitor visitor) {
2324
visitor.visitBooleanExpr(this);
2425
}
2526

27+
@Override
28+
public <T> T compute(PolicyComputationVisitor<T> visitor) {
29+
return visitor.visitBooleanExpr(this);
30+
}
31+
2632
@Override
2733
public String toString() {
2834
return String.valueOf(value);

rsvp/policy-ast/src/main/java/uq/pac/rsvp/policy/ast/expr/CallExpression.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.util.List;
66

77
import uq.pac.rsvp.policy.ast.SourceLoc;
8+
import uq.pac.rsvp.policy.ast.visitor.PolicyComputationVisitor;
89
import uq.pac.rsvp.policy.ast.visitor.PolicyVisitor;
910

1011
public class CallExpression extends Expression {
@@ -43,6 +44,11 @@ public void accept(PolicyVisitor visitor) {
4344
visitor.visitCallExpr(this);
4445
}
4546

47+
@Override
48+
public <T> T compute(PolicyComputationVisitor<T> visitor) {
49+
return visitor.visitCallExpr(this);
50+
}
51+
4652
@Override
4753
public String toString() {
4854
StringBuilder sb = new StringBuilder();

rsvp/policy-ast/src/main/java/uq/pac/rsvp/policy/ast/expr/ConditionalExpression.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.google.gson.annotations.SerializedName;
66

77
import uq.pac.rsvp.policy.ast.SourceLoc;
8+
import uq.pac.rsvp.policy.ast.visitor.PolicyComputationVisitor;
89
import uq.pac.rsvp.policy.ast.visitor.PolicyVisitor;
910

1011
public class ConditionalExpression extends Expression {
@@ -40,6 +41,11 @@ public void accept(PolicyVisitor visitor) {
4041
visitor.visitConditionalExpr(this);
4142
}
4243

44+
@Override
45+
public <T> T compute(PolicyComputationVisitor<T> visitor) {
46+
return visitor.visitConditionalExpr(this);
47+
}
48+
4349
@Override
4450
public String toString() {
4551
StringBuilder sb = new StringBuilder();

rsvp/policy-ast/src/main/java/uq/pac/rsvp/policy/ast/expr/EntityExpression.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import com.google.gson.JsonElement;
1414

1515
import uq.pac.rsvp.policy.ast.SourceLoc;
16+
import uq.pac.rsvp.policy.ast.visitor.PolicyComputationVisitor;
1617
import uq.pac.rsvp.policy.ast.visitor.PolicyVisitor;;
1718

1819
public class EntityExpression extends Expression {
@@ -41,6 +42,11 @@ public void accept(PolicyVisitor visitor) {
4142
visitor.visitEntityExpr(this);
4243
}
4344

45+
@Override
46+
public <T> T compute(PolicyComputationVisitor<T> visitor) {
47+
return visitor.visitEntityExpr(this);
48+
}
49+
4450
@Override
4551
public String toString() {
4652
return String.join("::", path) + "::\"" + eid + "\"";

rsvp/policy-ast/src/main/java/uq/pac/rsvp/policy/ast/expr/Expression.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.google.gson.annotations.SerializedName;
1111

1212
import uq.pac.rsvp.policy.ast.SourceLoc;
13+
import uq.pac.rsvp.policy.ast.visitor.PolicyComputationVisitor;
1314
import uq.pac.rsvp.policy.ast.visitor.PolicyVisitor;
1415

1516
public abstract class Expression {
@@ -68,6 +69,8 @@ protected Expression(ExprType type, SourceLoc source) {
6869

6970
public abstract void accept(PolicyVisitor visitor);
7071

72+
public abstract <T> T compute(PolicyComputationVisitor<T> visitor);
73+
7174
public final SourceLoc getSourceLoc() {
7275
return source != null ? source : MISSING_SRC;
7376
}

0 commit comments

Comments
 (0)