From 16a20ee8b08df919e93ea1b878013f9a2ad709fa Mon Sep 17 00:00:00 2001 From: Uko Kokņevičs Date: Sat, 24 Aug 2024 03:54:25 +0800 Subject: Added fancier tuple argument specs. Made ArgSpec use visitor pattern to avoid problems the best way. Merged empty tuple and non-empty tuple classes. --- ast/src/main/java/lv/enes/orang/ast/ArgSpec.java | 38 ++-------------------- .../java/lv/enes/orang/ast/ArgSpecIgnored.java | 13 ++++++++ .../main/java/lv/enes/orang/ast/ArgSpecNamed.java | 11 +++++++ .../main/java/lv/enes/orang/ast/ArgSpecTuple.java | 12 +++++++ .../java/lv/enes/orang/ast/ArgSpecVisitor.java | 13 ++++++++ .../java/lv/enes/orang/ast/EmptyTupleLiteral.java | 14 -------- .../java/lv/enes/orang/ast/ExpressionVisitor.java | 1 - .../java/lv/enes/orang/ast/TupleExpression.java | 5 ++- 8 files changed, 54 insertions(+), 53 deletions(-) create mode 100644 ast/src/main/java/lv/enes/orang/ast/ArgSpecIgnored.java create mode 100644 ast/src/main/java/lv/enes/orang/ast/ArgSpecNamed.java create mode 100644 ast/src/main/java/lv/enes/orang/ast/ArgSpecTuple.java create mode 100644 ast/src/main/java/lv/enes/orang/ast/ArgSpecVisitor.java delete mode 100644 ast/src/main/java/lv/enes/orang/ast/EmptyTupleLiteral.java (limited to 'ast') diff --git a/ast/src/main/java/lv/enes/orang/ast/ArgSpec.java b/ast/src/main/java/lv/enes/orang/ast/ArgSpec.java index 8fa52be..fd1c8f9 100644 --- a/ast/src/main/java/lv/enes/orang/ast/ArgSpec.java +++ b/ast/src/main/java/lv/enes/orang/ast/ArgSpec.java @@ -1,39 +1,7 @@ package lv.enes.orang.ast; -public sealed interface ArgSpec { - enum Type { - IGNORED, - NOTHING, - NAMED, - } +import lv.enes.orang.core.OrangException; - Type getType(); - - static Ignored ignored() { - return Ignored.INSTANCE; - } - - static Named named(String name) { - return new Named(name); - } - - static Nothing nothing() { - return Nothing.INSTANCE; - } - - final class Ignored implements ArgSpec { - public static final Ignored INSTANCE = new Ignored(); - private Ignored() {} - @Override public Type getType() { return Type.IGNORED; } - } - - record Named(String name) implements ArgSpec { - @Override public Type getType() { return Type.NAMED; } - } - - final class Nothing implements ArgSpec { - public static final Nothing INSTANCE = new Nothing(); - private Nothing() {} - @Override public Type getType() { return Type.NOTHING; } - } +public interface ArgSpec { + R accept(ArgSpecVisitor visitor) throws E; } diff --git a/ast/src/main/java/lv/enes/orang/ast/ArgSpecIgnored.java b/ast/src/main/java/lv/enes/orang/ast/ArgSpecIgnored.java new file mode 100644 index 0000000..95ad114 --- /dev/null +++ b/ast/src/main/java/lv/enes/orang/ast/ArgSpecIgnored.java @@ -0,0 +1,13 @@ +package lv.enes.orang.ast; + +import lv.enes.orang.core.OrangException; + +public final class ArgSpecIgnored implements ArgSpec { + public static final ArgSpecIgnored INSTANCE = new ArgSpecIgnored(); + private ArgSpecIgnored() {} + + @Override + public R accept(ArgSpecVisitor visitor) throws E { + return visitor.visitIgnored(); + } +} diff --git a/ast/src/main/java/lv/enes/orang/ast/ArgSpecNamed.java b/ast/src/main/java/lv/enes/orang/ast/ArgSpecNamed.java new file mode 100644 index 0000000..7c83275 --- /dev/null +++ b/ast/src/main/java/lv/enes/orang/ast/ArgSpecNamed.java @@ -0,0 +1,11 @@ +package lv.enes.orang.ast; + +import lv.enes.orang.core.OrangException; + +public record ArgSpecNamed(String name) implements ArgSpec { + @Override + public R accept(ArgSpecVisitor visitor) throws E { + return visitor.visitNamed(this); + } +} + diff --git a/ast/src/main/java/lv/enes/orang/ast/ArgSpecTuple.java b/ast/src/main/java/lv/enes/orang/ast/ArgSpecTuple.java new file mode 100644 index 0000000..6703def --- /dev/null +++ b/ast/src/main/java/lv/enes/orang/ast/ArgSpecTuple.java @@ -0,0 +1,12 @@ +package lv.enes.orang.ast; + +import lv.enes.orang.core.OrangException; + +import java.util.List; + +public record ArgSpecTuple(List children) implements ArgSpec { + @Override + public R accept(ArgSpecVisitor visitor) throws E { + return visitor.visitTuple(this); + } +} diff --git a/ast/src/main/java/lv/enes/orang/ast/ArgSpecVisitor.java b/ast/src/main/java/lv/enes/orang/ast/ArgSpecVisitor.java new file mode 100644 index 0000000..33cb6d6 --- /dev/null +++ b/ast/src/main/java/lv/enes/orang/ast/ArgSpecVisitor.java @@ -0,0 +1,13 @@ +package lv.enes.orang.ast; + +import lv.enes.orang.core.OrangException; + +public interface ArgSpecVisitor { + default R visit(ArgSpec argSpec) throws E { + return argSpec.accept(this); + } + + R visitIgnored() throws E; + R visitNamed(ArgSpecNamed named) throws E; + R visitTuple(ArgSpecTuple tuple) throws E; +} diff --git a/ast/src/main/java/lv/enes/orang/ast/EmptyTupleLiteral.java b/ast/src/main/java/lv/enes/orang/ast/EmptyTupleLiteral.java deleted file mode 100644 index a96580f..0000000 --- a/ast/src/main/java/lv/enes/orang/ast/EmptyTupleLiteral.java +++ /dev/null @@ -1,14 +0,0 @@ -package lv.enes.orang.ast; - -import lv.enes.orang.core.OrangException; - -public final class EmptyTupleLiteral implements Expression { - public static final EmptyTupleLiteral INSTANCE = new EmptyTupleLiteral(); - - private EmptyTupleLiteral() {} - - @Override - public R accept(ExpressionVisitor visitor) throws E { - return visitor.visitEmptyTupleExpression(); - } -} diff --git a/ast/src/main/java/lv/enes/orang/ast/ExpressionVisitor.java b/ast/src/main/java/lv/enes/orang/ast/ExpressionVisitor.java index c32b429..226b340 100644 --- a/ast/src/main/java/lv/enes/orang/ast/ExpressionVisitor.java +++ b/ast/src/main/java/lv/enes/orang/ast/ExpressionVisitor.java @@ -12,7 +12,6 @@ public interface ExpressionVisitor { R visitBinaryExpression(BinaryExpression expr) throws E; R visitCallExpression(CallExpression expr) throws E; R visitDoExpression(DoExpression expr) throws E; - R visitEmptyTupleExpression() throws E; R visitFnExpression(FnExpression expr) throws E; R visitIfElseExpression(IfElseExpression expr) throws E; R visitIntLiteral(IntLiteral expr) throws E; diff --git a/ast/src/main/java/lv/enes/orang/ast/TupleExpression.java b/ast/src/main/java/lv/enes/orang/ast/TupleExpression.java index 9df418d..84f2ceb 100644 --- a/ast/src/main/java/lv/enes/orang/ast/TupleExpression.java +++ b/ast/src/main/java/lv/enes/orang/ast/TupleExpression.java @@ -1,11 +1,10 @@ package lv.enes.orang.ast; import lv.enes.orang.core.OrangException; -import lv.enes.orang.utils.NonEmptyList; -public record TupleExpression(NonEmptyList children) implements Expression { - // assert children.size() >= 2 +import java.util.List; +public record TupleExpression(List children) implements Expression { @Override public R accept(ExpressionVisitor visitor) throws E { return visitor.visitTupleExpression(this); -- cgit v1.2.3