From 1fd741f7d5019b929affd29741b5ce92d7993f0f Mon Sep 17 00:00:00 2001 From: Uko Kokņevičs Date: Thu, 22 Aug 2024 22:04:14 +0800 Subject: Fix bug in checker that made it not execute and made ArgSpec less likely to cause accidental errors. --- ast/src/main/java/lv/enes/orang/ast/ArgSpec.java | 43 ++++++++++++---------- .../main/java/lv/enes/orang/checker/Checker.java | 8 +++- .../java/lv/enes/orang/value/PartialFunction.java | 4 +- 3 files changed, 32 insertions(+), 23 deletions(-) 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 7fea2f4..8fa52be 100644 --- a/ast/src/main/java/lv/enes/orang/ast/ArgSpec.java +++ b/ast/src/main/java/lv/enes/orang/ast/ArgSpec.java @@ -1,34 +1,39 @@ package lv.enes.orang.ast; -public class ArgSpec { - public final Type type; +public sealed interface ArgSpec { + enum Type { + IGNORED, + NOTHING, + NAMED, + } - // non-null if NAMED - public final String name; + Type getType(); - private static final ArgSpec NOTHING = new ArgSpec(Type.NOTHING, null); - private static final ArgSpec IGNORED = new ArgSpec(Type.IGNORED, null); + static Ignored ignored() { + return Ignored.INSTANCE; + } - public static ArgSpec ignored() { - return IGNORED; + static Named named(String name) { + return new Named(name); } - public static ArgSpec nothing() { - return NOTHING; + static Nothing nothing() { + return Nothing.INSTANCE; } - public static ArgSpec named(String name) { - return new ArgSpec(Type.NAMED, name); + final class Ignored implements ArgSpec { + public static final Ignored INSTANCE = new Ignored(); + private Ignored() {} + @Override public Type getType() { return Type.IGNORED; } } - private ArgSpec(Type type, String name) { - this.type = type; - this.name = name; + record Named(String name) implements ArgSpec { + @Override public Type getType() { return Type.NAMED; } } - public enum Type { - IGNORED, - NOTHING, - NAMED, + final class Nothing implements ArgSpec { + public static final Nothing INSTANCE = new Nothing(); + private Nothing() {} + @Override public Type getType() { return Type.NOTHING; } } } diff --git a/checker/src/main/java/lv/enes/orang/checker/Checker.java b/checker/src/main/java/lv/enes/orang/checker/Checker.java index 446d3f1..14604b8 100644 --- a/checker/src/main/java/lv/enes/orang/checker/Checker.java +++ b/checker/src/main/java/lv/enes/orang/checker/Checker.java @@ -58,7 +58,9 @@ public class Checker implements ExpressionVisitor, State if (definitions.hasDefinition(def.name())) { throw new CheckerException(STR."Top-level definition '\{def.name()}' redefined!"); } - return new Checker(ImmutableScope.of(definitions, def.name(), true)); + var ch = new Checker(ImmutableScope.of(definitions, def.name(), true)); + ch.visit(def.body()); + return ch; } @Override @@ -79,7 +81,9 @@ public class Checker implements ExpressionVisitor, State public Void visitFnExpression(FnExpression expr) throws CheckerException { var args = new HashMap(); for (var arg : expr.args()) { - args.put(arg.name, true); + if (arg instanceof ArgSpec.Named(String name)) { + args.put(name, true); + } } new Checker(ImmutableScope.of(definitions, args)).visit(expr.body()); return null; diff --git a/orang/src/main/java/lv/enes/orang/value/PartialFunction.java b/orang/src/main/java/lv/enes/orang/value/PartialFunction.java index e73ba0c..d03bb13 100644 --- a/orang/src/main/java/lv/enes/orang/value/PartialFunction.java +++ b/orang/src/main/java/lv/enes/orang/value/PartialFunction.java @@ -12,8 +12,8 @@ public record PartialFunction(Scope scope, NonEmptyList remainin public static Value of(Scope scope, NonEmptyList remainingArgs, Expression body, Value param) throws OrangRuntimeException { var spec = remainingArgs.getFirst(); var newScope = MutableScope.of(scope); - switch (spec.type) { - case NAMED -> newScope.setDefinition(spec.name, param); + switch (spec.getType()) { + case NAMED -> newScope.setDefinition(((ArgSpec.Named)spec).name(), param); case NOTHING -> { if (!(param instanceof Nothing)) { throw new OrangRuntimeException(STR."Expected () as a parameter but got \{param.typeName()}"); -- cgit v1.2.3