diff --git a/src/main/java/suite/funp/Funp_.java b/src/main/java/suite/funp/Funp_.java index 8e5bd845f..1b20b83cc 100644 --- a/src/main/java/suite/funp/Funp_.java +++ b/src/main/java/suite/funp/Funp_.java @@ -42,6 +42,7 @@ import suite.node.parser.IterativeParser; import suite.node.util.Singleton; import suite.object.CastDefaults; +import suite.object.MetadataDefaults; import suite.object.SwitchDefaults; import suite.util.Switch; @@ -54,7 +55,10 @@ public class Funp_ extends FunpCfg { public boolean isOptimize; - public interface Funp extends CastDefaults, SwitchDefaults { + public interface Funp extends CastDefaults, MetadataDefaults, SwitchDefaults { + } + + public static class FunpMetadata { } public static class CompileException extends RuntimeException { diff --git a/src/main/java/suite/funp/SwitchFunp.java b/src/main/java/suite/funp/SwitchFunp.java new file mode 100644 index 000000000..ce19e63f7 --- /dev/null +++ b/src/main/java/suite/funp/SwitchFunp.java @@ -0,0 +1,23 @@ +package suite.funp; + +import suite.funp.Funp_.Funp; +import suite.funp.Funp_.FunpMetadata; +import suite.util.Switch; + +public class SwitchFunp extends Switch { + + private FunpMetadata metadata; + + public SwitchFunp(Funp in) { + super(in); + metadata = in.getMetadata(); + } + + public Funp result() { + var result = super.result(); + if (result != null) + result.setMetadata(metadata); + return result; + } + +} diff --git a/src/main/java/suite/node/Node.java b/src/main/java/suite/node/Node.java index 0eeb13f7b..a19863c9d 100644 --- a/src/main/java/suite/node/Node.java +++ b/src/main/java/suite/node/Node.java @@ -2,8 +2,9 @@ import suite.node.io.Formatter; import suite.node.util.Comparer; +import suite.object.MetadataDefaults; -public abstract class Node implements Comparable { +public abstract class Node implements Comparable, MetadataDefaults { public Node finalNode() { return this; diff --git a/src/main/java/suite/node/io/SwitchNode.java b/src/main/java/suite/node/io/SwitchNode.java index 34a91a390..ffbf4cd5c 100644 --- a/src/main/java/suite/node/io/SwitchNode.java +++ b/src/main/java/suite/node/io/SwitchNode.java @@ -147,6 +147,7 @@ public SwitchNode matchArray(String pattern, Fun fun) { } public R nonNullResult() { + var result = result(); return result != null ? result : fail("cannot handle " + in); } diff --git a/src/main/java/suite/object/MetadataDefaults.java b/src/main/java/suite/object/MetadataDefaults.java new file mode 100644 index 000000000..8038e3608 --- /dev/null +++ b/src/main/java/suite/object/MetadataDefaults.java @@ -0,0 +1,22 @@ +package suite.object; + +import java.util.Map; +import java.util.WeakHashMap; + +public interface MetadataDefaults { + + public static Map metadata = new WeakHashMap<>(); + + public default T getMetadata() { + @SuppressWarnings("unchecked") + var t = (T) metadata.get(this); + return t; + } + + public default T setMetadata(T t) { + @SuppressWarnings("unchecked") + T t0 = (T) metadata.put(this, t); + return t0; + } + +} diff --git a/src/main/java/suite/util/Switch.java b/src/main/java/suite/util/Switch.java index 50b9dd9b6..2d7b4b876 100644 --- a/src/main/java/suite/util/Switch.java +++ b/src/main/java/suite/util/Switch.java @@ -33,6 +33,7 @@ public Switch doIf(Class c, IoSink fun) { } public R nonNullResult() { + var result = result(); return result != null ? result : fail("cannot handle " + in); }