From 26bd73d87e350bf121772b38ed2d0775d7ff2f82 Mon Sep 17 00:00:00 2001 From: JFronny Date: Fri, 22 Sep 2023 18:20:52 +0200 Subject: [PATCH] fix(muscript): clean up ExprGroup side effect handling for extractSideEffects and decompile --- .../muscript/ast/dynamic/ExprGroup.java | 39 ++++++++++++------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/dynamic/ExprGroup.java b/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/dynamic/ExprGroup.java index d5c8e15..20f6173 100644 --- a/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/dynamic/ExprGroup.java +++ b/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/dynamic/ExprGroup.java @@ -3,6 +3,7 @@ package io.gitlab.jfronny.muscript.ast.dynamic; import io.gitlab.jfronny.muscript.ast.DynamicExpr; import io.gitlab.jfronny.muscript.ast.Expr; import io.gitlab.jfronny.muscript.ast.NullLiteral; +import io.gitlab.jfronny.muscript.ast.string.Concatenate; import io.gitlab.jfronny.muscript.compiler.CodeLocation; import io.gitlab.jfronny.muscript.compiler.ExprWriter; import io.gitlab.jfronny.muscript.compiler.Order; @@ -37,6 +38,7 @@ public class ExprGroup extends DynamicExpr { this.fin = expressions.get(expressions.size() - 1).asDynamicExpr(); this.packedArgs = packedArgs; this.fork = fork; + if (!fork && packedArgs != null) throw new UnsupportedOperationException("packedArgs may only be used for forking ExprGroups"); } public static Expr of(CodeLocation location, List> expressions) { @@ -52,7 +54,7 @@ public class ExprGroup extends DynamicExpr { @Override public Dynamic get(Scope dataRoot) { Scope fork = this.fork ? dataRoot.fork() : dataRoot; - if (packedArgs != null) { + if (this.fork && packedArgs != null) { List from = new LinkedList<>(); for (Call.Arg arg : packedArgs.from) { Dynamic data = arg.expr().get(dataRoot); @@ -95,23 +97,32 @@ public class ExprGroup extends DynamicExpr { @Override public Stream> extractSideEffects() { - return Stream.of(of(location, stream().flatMap(Expr::extractSideEffects).toList())); + return fork ? Stream.of(this) : Stream.of(of(location, stream().flatMap(Expr::extractSideEffects).toList())); } @Override public void decompile(ExprWriter writer) throws IOException { - new Call( - location, - new Closure( - location, - packedArgs == null - ? List.of() - : packedArgs.to, - stream().toList(), - false - ), - packedArgs == null ? List.of() : packedArgs.from - ).decompile(writer); + if (!fork) { + // Use string concatenation since the result is ignored either way + stream() + .reduce((left, right) -> new Concatenate(location, left.asStringExpr(), right.asStringExpr())) + .orElseGet(() -> new NullLiteral(location)) + .optimize() + .decompile(writer); + } else { + new Call( + location, + new Closure( + location, + packedArgs == null + ? List.of() + : packedArgs.to, + stream().toList(), + false + ), + packedArgs == null ? List.of() : packedArgs.from + ).decompile(writer); + } } public Stream> stream() {