From 1ddcda7bd2b7148f4c6ba4f23791786c64d1fbec Mon Sep 17 00:00:00 2001 From: Uko Kokņevičs Date: Thu, 22 Aug 2024 22:46:49 +0800 Subject: Get rid of that Scope mess --- .../main/java/lv/enes/orang/checker/Checker.java | 39 +++++++++------------- 1 file changed, 16 insertions(+), 23 deletions(-) (limited to 'checker/src/main/java/lv') 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 14604b8..ee0914f 100644 --- a/checker/src/main/java/lv/enes/orang/checker/Checker.java +++ b/checker/src/main/java/lv/enes/orang/checker/Checker.java @@ -1,27 +1,17 @@ package lv.enes.orang.checker; import lv.enes.orang.ast.*; -import lv.enes.orang.core.ImmutableScope; -import lv.enes.orang.core.Scope; -import java.util.HashMap; -import java.util.Map; +import java.util.*; public class Checker implements ExpressionVisitor, StatementVisitor { - private final Scope definitions; + private final Set definitions; public static Checker of(Map builtins) { - var boolMap = builtins.keySet() - .stream() - .>collect( - HashMap::new, - (map, elem) -> map.put(elem, true), - Map::putAll - ); - return new Checker(ImmutableScope.of(boolMap)); + return new Checker(Collections.unmodifiableSet(builtins.keySet())); } - private Checker(Scope definitions) { + private Checker(Set definitions) { this.definitions = definitions; } @@ -55,10 +45,13 @@ public class Checker implements ExpressionVisitor, State @Override public Checker visitDefinition(Definition def) throws CheckerException { - if (definitions.hasDefinition(def.name())) { + if (definitions.contains(def.name())) { throw new CheckerException(STR."Top-level definition '\{def.name()}' redefined!"); } - var ch = new Checker(ImmutableScope.of(definitions, def.name(), true)); + + var newScope = new HashSet<>(definitions); + newScope.add(def.name()); + var ch = new Checker(newScope); ch.visit(def.body()); return ch; } @@ -79,13 +72,13 @@ public class Checker implements ExpressionVisitor, State @Override public Void visitFnExpression(FnExpression expr) throws CheckerException { - var args = new HashMap(); + var newScope = new HashSet<>(definitions); for (var arg : expr.args()) { if (arg instanceof ArgSpec.Named(String name)) { - args.put(name, true); + newScope.add(name); } } - new Checker(ImmutableScope.of(definitions, args)).visit(expr.body()); + new Checker(newScope).visit(expr.body()); return null; } @@ -105,11 +98,11 @@ public class Checker implements ExpressionVisitor, State @Override public Void visitLetInExpression(LetInExpression expr) throws CheckerException { - var locals = new HashMap(); + var newScope = new HashSet<>(definitions); for (var local : expr.bindings()) { - locals.put(local.name(), true); + newScope.add(local.name()); } - new Checker(ImmutableScope.of(definitions, locals)).visit(expr.body()); + new Checker(newScope).visit(expr.body()); return null; } @@ -136,7 +129,7 @@ public class Checker implements ExpressionVisitor, State @Override public Void visitVariable(VariableExpression expr) throws CheckerException { - if (!definitions.hasDefinition(expr.name())) { + if (!definitions.contains(expr.name())) { throw new CheckerException(STR."Variable named '\{expr.name()}' not defined!"); } return null; -- cgit v1.2.3